简体   繁体   English

Android:使用xml定义创建一个三角形的按钮(可绘制)

[英]Android: Make a button with triangle shape using xml definitions (drawable)

I want create this using button (TextView) by using XML definiton: 我想通过使用XML定义使用按钮(TextView)创建它:

我的形象

In layout of the Activity I have: 在我的活动布局中:

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@drawable/button_arrow" <!-- I NEED IMPLEMENT THIS -->
        android:clickable="true"
        android:drawablePadding="7dp"
        android:gravity="center"
        android:drawableLeft="@drawable/music_cloud"
        android:onClick="exportSong"
        android:padding="20dp"
        android:text="@string/export_upload"
        android:textAppearance="?android:attr/textAppearanceMedium"
        android:textColor="@color/dark_yellow_text_color"
        android:textStyle="bold" />

I founded several posts: 我创建了几个帖子:

making-a-triangle-shape-using-xml-definitions 制作-A-三角形形状使用-XML的定义

Android triangle (arrow) defined as an XML shape Android三角形(箭头)定义为XML形状

or Android - make an arrow shape with xml Android - 使用xml制作箭头形状

I tried modify several XML definition but nothing was good. 我尝试修改几个XML定义,但没有什么是好的。 Is there some easy way how to implement this shape? 如何实现这种形状有一些简单的方法吗? Also it should have a transparent background. 它也应该有一个透明的背景。

If someone still has issues with this : 如果有人仍然有这个问题:

  1. xml: XML:

     <item android:top="45dp"> <shape> <size android:height="100dp" android:width="90dp"/> <solid android:color="@android:color/holo_orange_light" /> </shape> </item> <item android:top="36dp" android:left="11dp"> <rotate android:fromDegrees="45" android:toDegrees="0" android:pivotX="80%" android:pivotY="20%" > <shape> <size android:width="40dp" android:height="30dp"/> <stroke android:color="@android:color/holo_orange_light" android:width="1dp"/> <solid android:color="@android:color/holo_orange_light" /> </shape> </rotate> </item> </layer-list> 
  2. override TextView and use it in your layout: 覆盖TextView并在布局中使用它:

     public class CustomTextView extends TextView { private int mWidth; private int mHeight; public CustomTextView(Context context, AttributeSet attrs) { super(context, attrs); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); Paint mPaint = new Paint(); int color = getResources().getColor(R.color.YourColor); mPaint.setColor(color); Path mPath = new Path(); mPath.moveTo(.0f, this.getHeight()); mPath.lineTo(0.8f * this.getWidth(), this.getHeight()); mPath.lineTo(this.getWidth(), 0.5f * this.getHeight()); mPath.lineTo(0.8f * this.getWidth(), .0f); mPath.lineTo(.0f, .0f); mPath.lineTo(.0f, this.getHeight()); canvas.clipPath(mPath); canvas.drawPath(mPath,mPaint); } } 

Regarding the xml example: there are two rectangles overlapping.You have to play around with the values a lot and this makes it difficult to use on different views. 关于xml示例:有两个矩形重叠。您必须大量使用这些值,这使得难以在不同的视图上使用。 I think using a custom view is the best solution in this case. 我认为在这种情况下使用自定义视图是最佳解决方案。

<item>
    <inset android:insetBottom="2dp" >
        <selector xmlns:android="http://schemas.android.com/apk/res/android" >
            <item android:state_pressed="true">
                <shape android:shape="rectangle" >
                    <corners android:radius="3dip" />

                    <stroke
                        android:width="1dip"
                        android:color="#5e7974" />

                    <gradient
                        android:angle="-90"
                        android:centerColor="#ECEFF1"
                        android:endColor="#FFAB00"
                        android:startColor="#FFAB00" />
                </shape>
            </item>
            <item android:state_focused="true">
                <shape android:shape="rectangle" >
                    <corners android:radius="3dip" />

                    <stroke
                        android:width="1dip"
                        android:color="#5e7974" />

                    <gradient
                        android:angle="-90"
                        android:centerColor="#ECEFF1"
                        android:endColor="#FFAB00"
                        android:startColor="#FFAB00" />
                </shape>
            </item>
            <item>
                <shape android:shape="rectangle" >
                    <corners android:radius="3dip" />

                    <stroke
                        android:width="1dip"
                        android:color="#5e7974" />

                    <gradient
                        android:angle="-90"
                        android:centerColor="#ECEFF1"
                        android:endColor="#FFD600"
                        android:startColor="#FFD600" />
                </shape>
            </item>
        </selector>
    </inset>
</item>
<item
    android:bottom="65dp"
    android:right="-129dp"
    android:top="-40dp">
    <rotate android:fromDegrees="50" >
        <shape android:shape="rectangle" >
            <solid android:color="@color/background_color_light_yellow" />
        </shape>
    </rotate>
</item>
<item
    android:bottom="-40dp"
    android:right="-129dp"
    android:top="65dp">
    <rotate android:fromDegrees="-50" >
        <shape android:shape="rectangle" >
            <solid android:color="@color/background_color_light_yellow" />
        </shape>
    </rotate>
</item>

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM