【问题标题】:Draw custom drawable shape in android在android中绘制自定义可绘制形状
【发布时间】:2018-10-08 18:18:37
【问题描述】:

我想在xml 布局中绘制一个自定义形状,如下所示:

我尝试在XML 中编写一些代码,但我不明白如何为这个阴影的轮廓赋予阴影效果。

我做了什么:

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

    <item
        android:width="20dp"
        android:height="20dp"
        android:gravity="top|left">
        <rotate
            android:fromDegrees="45"
            android:pivotX="50%"
            android:pivotY="50%"
            android:toDegrees="45">
            <shape android:shape="rectangle">

                <corners android:bottomRightRadius="2dp"/>

                <gradient android:type="linear" android:angle="270" android:startColor="#ffffff" android:endColor="#ffffff"/>
            </shape>

        </rotate>
    </item>
    <item
        android:width="120dp"
        android:height="36dp"
        android:bottom="6dp">
        <shape android:shape="rectangle">

            <gradient
                android:angle="0"
                android:endColor="@color/color_white"
                android:startColor="@color/color_white"
                android:type="linear" />

            <corners android:radius="6dp" />

        </shape>

    </item>
</layer-list>

我得到的结果:

谁能建议我如何在上面提到的图片中给轮廓添加阴影?或任何其他解决方案,如 9 补丁图像。我怎样才能画出这样的 9 个补丁图像?

【问题讨论】:

    标签: android android-layout android-drawable


    【解决方案1】:

    更好的方法 不要使用 layer-list

    创建整个形状
    • 使用它的主要缺点是您需要固定hightwidthshape

    使用简单的方法,只需使用 layer-list 创建顶部箭头,然后使用以下示例

    试试这个

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="5dp"
        android:orientation="vertical">
    
        <ImageView
            android:layout_width="50dp"
            android:layout_height="50dp"
            android:layout_marginStart="10dp"
            android:src="@drawable/test" />
    
    
        <LinearLayout
            android:id="@+id/rootView"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="@android:color/white"
            android:orientation="vertical">
    
    
            <TextView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:padding="5dp"
                android:text=" Lorem ipsum dolor sit amet, consectetur adipiscing elit"
                android:textColor="@color/colorAccent" />
    
            <TextView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:padding="5dp"
                android:text=" Lorem ipsum dolor sit amet, consectetur adipiscing elit"
                android:textColor="@android:color/black" />
    
    
        </LinearLayout>
    
    
    </LinearLayout>
    

    @drawable/test"

    <?xml version="1.0" encoding="utf-8"?>
    <layer-list xmlns:android="http://schemas.android.com/apk/res/android">
        <item>
            <rotate
                android:fromDegrees="45"
                android:pivotX="-40%"
                android:pivotY="87%"
                android:toDegrees="45">
                <shape android:shape="rectangle">
                    <stroke
                        android:width="10dp"
                        android:color="@android:color/white" />
                    <solid android:color="@android:color/white" />
                </shape>
            </rotate>
        </item>
    </layer-list>
    

    输出

    【讨论】:

    • 感谢您的回答,但轮廓中没有显示阴影?
    • 你能告诉我如何将它附加到我的布局中吗?意味着当我把它作为我的线性布局的背景时。线性布局不显示为
    • 好的,谢谢。我检查一下
    • 是的,这解决了我的问题,您的解决方案还解决了内容高度和宽度的问题,因为我不必在可绘制布局中传递静态高度和宽度。非常感谢 :)
    【解决方案2】:

    你创建分层形状为

    <?xml version="1.0" encoding="utf-8"?>
    <layer-list xmlns:android="http://schemas.android.com/apk/res/android">
        <item
            android:width="120dp"
            android:height="36dp"
            >
            <shape>
                <padding
                    android:bottom="1dp"
                    android:right="1dp"
                    android:top="1dp" />
    
                <solid android:color="#20CCCCCC" />
    
                <corners android:radius="3dp" />
            </shape>
        </item>
        <item
            android:width="120dp"
            android:height="36dp"
            >
            <shape>
                <padding
                    android:bottom="1dp"
                    android:right="1dp"
                    android:top="1dp" />
    
                <solid android:color="#30CCCCCC" />
    
                <corners android:radius="3dp" />
            </shape>
        </item>
        <item
            android:width="120dp"
            android:height="36dp"
            >
            <shape>
                <padding
                    android:bottom="1dp"
                    android:right="1dp"
                    android:top="1dp" />
    
                <solid android:color="#50CCCCCC" />
    
                <corners android:radius="3dp" />
            </shape>
        </item>
        <item
            android:width="20dp"
            android:height="20dp"
            android:gravity="top|left">
            <rotate
                android:fromDegrees="45"
                android:pivotX="70%"
                android:pivotY="40%"
                android:toDegrees="45">
                <shape android:shape="rectangle">
                    <gradient android:type="linear" android:angle="270" android:startColor="#05CCCCCC" android:endColor="#05CCCCCC"/>
                </shape>
    
            </rotate>
        </item>
    
        <item
            android:width="20dp"
            android:height="20dp"
            android:gravity="top|left">
            <rotate
                android:fromDegrees="45"
                android:pivotX="70%"
                android:pivotY="40%"
                android:toDegrees="45">
                <shape android:shape="rectangle">
                    <gradient android:type="linear" android:angle="270" android:startColor="#20CCCCCC" android:endColor="#20CCCCCC"/>
                </shape>
    
            </rotate>
        </item>
        <item
            android:width="20dp"
            android:height="20dp"
            android:gravity="top|left">
            <rotate
                android:fromDegrees="45"
                android:pivotX="60%"
                android:pivotY="45%"
                android:toDegrees="45">
                <shape android:shape="rectangle">
                    <gradient android:type="linear" android:angle="270" android:startColor="#30CCCCCC" android:endColor="#30CCCCCC"/>
                </shape>
    
            </rotate>
        </item>
        <item
            android:width="20dp"
            android:height="20dp"
            android:gravity="top|left">
            <rotate
                android:fromDegrees="45"
                android:pivotX="50%"
                android:pivotY="50%"
                android:toDegrees="45">
                <shape android:shape="rectangle">
    
                    <corners android:bottomRightRadius="2dp"/>
    
                    <gradient android:type="linear" android:angle="270" android:startColor="#ffffff" android:endColor="#ffffff"/>
                </shape>
    
            </rotate>
        </item>
    
        <item
            android:top="1dp"
            android:width="120dp"
            android:height="36dp"
            android:bottom="5dp">
            <shape android:shape="rectangle">
                <gradient
                    android:endColor="@android:color/white"
                    android:startColor="@android:color/white"
                    android:type="linear" />
            </shape>
        </item>
    
    </layer-list>
    

    输出:

    【讨论】:

    • 您好@Pavneet 感谢您的回答。您给出的解决方案可以很好地绘制形状,但我必须给出固定的高度和宽度,但请接受接受的答案。它还提供了高度和宽度的解决方案。谢谢
    • 我根据你的代码给出了一个答案,它没有作为要求被提及,并且在接受的答案中缺少要求,尽管你可以选择接受最合适的、快乐的编码!
    【解决方案3】:
    **Try this:**
    
    > **if you remove corner then delete <corners android:radius="@dimen/dp_5"/>  this line.**
    
    
        <?xml version="1.0" encoding="utf-8"?>
        <layer-list xmlns:android="http://schemas.android.com/apk/res/android">
            <item
                android:width="@dimen/dp_30"
                android:height="@dimen/font_20"
                android:gravity="top|left">
                <rotate
                    android:fromDegrees="45"
                    android:pivotX="60%"
                    android:pivotY="80%"
                    android:toDegrees="45">
                    <shape android:shape="rectangle">
    
                        <corners android:bottomRightRadius="2dp"/>
    
                        <solid android:color="@color/white"/>
                    </shape>
    
                </rotate>
            </item>
            <item
                android:width="120dp"
                android:height="36dp"
                android:bottom="6dp">
                <shape android:shape="rectangle">
    
                    <corners android:radius="@dimen/dp_5"/>
    
                    <solid android:color="@color/white"/>
                </shape>
            </item>
        </layer-list>
    

    【讨论】:

    • 你好@Riya 谢谢你的回答。您给出的解决方案可以很好地绘制形状,但我必须给出固定的高度和宽度,但请接受接受的答案。它还提供了高度和宽度的解决方案。谢谢
    【解决方案4】:

    试试这个

    <?xml version="1.0" encoding="utf-8"?>
    <layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:width="121dp"
        android:height="37dp"
        android:bottom="5dp">
        <shape android:shape="rectangle">
    
            <stroke
                android:color="@color/lightgrey"
                android:width="1dp"/>
    
        </shape>
    
    </item>
    <item
        android:width="21dp"
        android:height="21dp"
        android:gravity="top|left">
        <rotate
            android:fromDegrees="45"
            android:pivotX="50%"
            android:pivotY="50%"
            android:toDegrees="45">
            <shape android:shape="rectangle">
                <stroke
                    android:color="@color/lightgrey"
                    android:width="1dp"/>
    
                <corners android:bottomRightRadius="0dp"/>
    
                <gradient android:type="linear" android:angle="270" android:startColor="#ffffff" android:endColor="#ffffff"/>
            </shape>
    
        </rotate>
    </item>
    <item
        android:width="20dp"
        android:height="20dp"
        android:gravity="top|left">
        <rotate
            android:fromDegrees="45"
            android:pivotX="50%"
            android:pivotY="50%"
            android:toDegrees="45">
            <shape android:shape="rectangle">
    
                <corners android:bottomRightRadius="2dp"/>
    
                <gradient android:type="linear" android:angle="270" android:startColor="#ffffff" android:endColor="#ffffff"/>
            </shape>
    
        </rotate>
    </item>
    <item
        android:width="120dp"
        android:height="36dp"
        android:bottom="6dp">
        <shape android:shape="rectangle">
    
            <gradient
                android:angle="0"
                android:endColor="@color/white"
                android:startColor="@color/white"
                android:type="linear" />
    
        </shape>
    
    </item>
    </layer-list>
    

    【讨论】:

    • 您好@Diwakar 感谢您的回答。您给出的解决方案可以很好地绘制形状,但我必须给出固定的高度和宽度,但请接受接受的答案。它还提供了高度和宽度的解决方案。谢谢
    猜你喜欢
    • 1970-01-01
    • 2014-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-21
    • 2019-03-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多