【问题标题】:How to create parallelogram shape background?如何创建平行四边形形状背景?
【发布时间】:2015-05-19 14:02:45
【问题描述】:

我正在尝试为我的 textview 制作平行四边形背景,但它没有正确显示...它显示以下输出

<layer-list  >
    <item>
        <rotate
            android:fromDegrees="10"
            android:toDegrees="10"
            android:pivotX="-40%"
            android:pivotY="87%" >
            <shape
                android:shape="rectangle" >
                <stroke android:color="#000000" android:width="10dp"/>

            </shape>

        </rotate>

    </item>
</layer-list>

我需要这样的输出............

【问题讨论】:

标签: android shapedrawable


【解决方案1】:

<item
    android:bottom="-25dp"
    android:top="-25dp"
    android:left="25dp"
    android:right="25dp">
    <rotate android:fromDegrees="20">
        <shape android:shape="rectangle">
            <size
                android:width="50dp"
                android:height="100dp"/>
            <solid android:color="#13a8de"/>
        </shape>

    </rotate>
</item>

这一款适用于所有背景,而不仅仅是上面示例中的白色

【讨论】:

  • 太棒了,你怎么能动态改变这个颜色?
  • @NelsonHoang 你可以这样做:ShapeDrawable shapeDrawable = (ShapeDrawable) shape; shapeDrawable.getPaint().setColor(ContextCompat.getColor(context,R.color.myColort));
  • 它工作得非常顺利,对我来说很好。感谢您节省了我宝贵的时间!
  • 这是一个平行四边形吗?这只是一个旋转的矩形
  • @Manti_Core 不,检查一下,它是一个平行四边形
【解决方案2】:

作为@mmlooloo 的答案的替代品,我建议使用 xml-drawable 解决方案(因为您没有明确强调您正在寻找什么样的解决方案)。在下面的示例中,我使用了一般的View,但是您可以使用任何其他的。

这里是View

<View
    android:layout_width="100dp"
    android:layout_height="40dp"
    android:layout_centerInParent="true"
    android:background="@drawable/shape" />

shape.xml 本身

<?xml version="1.0" encoding="UTF-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >

<!-- Colored rectangle-->
<item>
    <shape android:shape="rectangle">
        <size 
            android:width="100dp"
            android:height="40dp" />
        <solid android:color="#13a89e" />
    </shape>
</item>

<!-- This rectangle for the left side -->
<!-- Its color should be the same as layout's background -->
<item
    android:right="100dp"
    android:left="-100dp"
    android:top="-100dp"
    android:bottom="-100dp">
    <rotate
        android:fromDegrees="45">
        <shape android:shape="rectangle">
            <solid android:color="#ffffff" />
        </shape>
    </rotate>
</item>

<!-- This rectangle for the right side -->
<!-- Their color should be the same as layout's background -->
<item
    android:right="-100dp"
    android:left="100dp"
    android:top="-100dp"
    android:bottom="-100dp">
    <rotate
        android:fromDegrees="45">
        <shape android:shape="rectangle">
            <solid android:color="#ffffff" />
        </shape>
    </rotate>
</item>

</layer-list>

如下所示:

【讨论】:

  • 完美的形状。你知道背景是否是视图之外的图像吗??
  • @Rathiga Jesika 没试过,但是据我所知,它不适用于 xml 定义的 shapedrawable。您可以尝试这样做programmatically 以获得更好的灵活性/自定义。
  • 这对我不起作用。真的只是一个大矩形。
  • @John61590,该解决方案仅适用于固定大小的视图。请注意,形状的大小与视图的宽度/高度相同。对于更灵活的解决方案,您应该使用程序化解决方案,例如正如上面评论中提到的那样......如果您对解决方案的构建方式有一些困惑,您可能会发现有关here 方法的一个小解释
【解决方案3】:

您可以像这样创建自定义Textview 来实现它:

public class ParallogramTextView extends TextView {


        Paint mBoarderPaint;
        Paint mInnerPaint;

        public ParallogramTextView(Context context) {
            super(context);
            init();
        }

        public ParallogramTextView(Context context, AttributeSet attrs, int defStyle) {
            super(context, attrs, defStyle);
            init();
        }

        public ParallogramTextView(Context context, AttributeSet attrs) {
            super(context, attrs);
            init();
        }


        private void init() {
            mBoarderPaint = new Paint();
            mBoarderPaint.setAntiAlias(true);
            mBoarderPaint.setColor(Color.BLACK);
            mBoarderPaint.setStyle(Paint.Style.STROKE);
            mBoarderPaint.setStrokeWidth(6);   

            mInnerPaint = new Paint();
            mInnerPaint.setAntiAlias(true);
            mInnerPaint.setColor(Color.parseColor("#13a89e"));
            mInnerPaint.setStyle(Paint.Style.FILL);
            mInnerPaint.setStrokeJoin(Paint.Join.ROUND);
        }


        @Override
        public void draw(Canvas canvas) {
            super.draw(canvas);
            Path path = new Path();
            path.moveTo(getWidth(),0);
            path.lineTo(getWidth()/2, 0);
            path.lineTo(0, getHeight());
            path.lineTo(getWidth()/2,getHeight());
            path.lineTo(getWidth(), 0);
            canvas.drawPath(path, mInnerPaint);
            canvas.drawPath(path, mBoarderPaint);
        }

}

并在布局文件中使用如下:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center">



    <com.example.ParallogramTextView
        android:id = "@+id/result"
        android:layout_width="500dp"
        android:layout_height="500dp"
        android:layout_centerInParent="true"
        android:gravity="center" 
        android:layout_margin="32dp" />


</RelativeLayout>

结果是:

【讨论】:

  • 参加聚会有点晚了,但是通过这种方法,我如何将“文本”放到前台?
  • 在覆盖的onDraw中可以移动set super.draw(canvas);到最后一行。然后文本视图通常所做的所有其他事情都将出现在平行四边形的顶部。如果背景设置为不可见,它会看起来不错。当然,最好用背景属性的颜色绘制平行四边形。
  • 这篇文章对我创建梯形视图有很大帮助arkapp.medium.com/trapezium-view-for-android-584799c7e849 在此帮助下,我能够创建一个以边为斜面的自定义视图。
【解决方案4】:

您指的是导航菜单吗?如果是这样,您可以使用此代码制作平行四边形:

ul#nav li a {
display: inline-block;
text-decoration:none;
padding:4px 10px;
border-radius:3px;
transform: skew(-10deg);
-o-transform: skew(-10deg);
-moz-transform: skew(-10deg);
-webkit-transform: skew(-10deg);
color:#000000;
}
ul#nav li a span {
display: inline-block;
transform: skew(10deg);
-o-transform: skew(10deg);
-moz-transform: skew(10deg);
-webkit-transform: skew(10deg);
}

您也可以在codepen 中查看 HTML 和 CSS 版本。

希望这会有所帮助。

【讨论】:

  • 如何在android中应用css
  • 我认为这个答案将受益于更多的解释和代码格式。
猜你喜欢
  • 1970-01-01
  • 2013-08-07
  • 2014-11-17
  • 1970-01-01
  • 2012-07-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多