zoukankan      html  css  js  c++  java
  • shape-自绘制简单图形

    shape 可以绘制简单的图形,颜色等。它主要就是应用于selector 的一些状态。

    本文内容参考自http://www.cnblogs.com/cyanfei/archive/2012/07/27/2612023.html

    自己验证了下,学习记录

    它主要有以下几个部分,分别是

    填充(solid):设置填充的颜色

    间隔(padding):设置四个方向上的间隔

    大小(size):设置大小

    圆角(corners):设置图形圆角,默认是正方形的

    渐变(gradient):当设置填充颜色后,无渐变效果。angle的值必须是45的倍数(包括0),仅在type="linear"有效,不然会报错。android:useLevel 这个属性不知道有什么用。

                                                                      

    接下来针对上面的内容,自己写下demo进行验证学习。

    1.验证corners 效果

    代码

    <?xml version="1.0" encoding="utf-8"?>
    <shape xmlns:android="http://schemas.android.com/apk/res/android" >
        <corners
            android:radius="20dp"
            android:topLeftRadius="12dp"
            android:bottomLeftRadius="18dp"
            android:topRightRadius="24dp"
            android:bottomRightRadius="30dp"/>
        <solid 
            android:color="#ff0000"
            />
    
    </shape>

    效果

    可以发现,当五个关于圆角半径的属性全部设置的时候,这时候radius 不起作用。

    然后我们少了个属性试下

    <corners
            android:bottomLeftRadius="18dp"
            android:bottomRightRadius="30dp"
            android:radius="20dp" />

    效果

    我们可以得出结论

    android:Radius="20dp"                           设置四个角的半径

    android:topLeftRadius="20dp"              设置左上角的半径
    android:topRightRadius="20dp"           设置右上角的半径
    android:bottomLeftRadius="20dp"      设置右下角的半径
    android:bottomRightRadius="20dp"    设置左下角的半径

    radius是设置的四个角圆弧半径,一但这个角单独进行了设定,优先选择单角数值

    另外,填充色solid必须有,否则看不到

    2.我们给上面的图形加个边框stroke

    <?xml version="1.0" encoding="utf-8"?>
    <shape xmlns:android="http://schemas.android.com/apk/res/android" >
    
        <corners
            android:bottomLeftRadius="18dp"
            android:bottomRightRadius="30dp"
            android:radius="20dp"
            android:topLeftRadius="12dp"
            android:topRightRadius="24dp" />
    
        <stroke
            android:dashGap="3dp"
            android:dashWidth="10dp"
            android:width="10dp"
            android:color="#0000ff" />
    
        <solid android:color="#ff0000" />
    
    </shape>

    看下效果

    然后我们更改属性

    <stroke
            android:dashGap="10dp"
            android:dashWidth="3dp"
            android:width="20dp"
            android:color="#0000ff" />

    结果

    如果dash属性有一个值为0,或不加这个属性

    结果就是

    结论

    描边(stroke):dashWidth和dashGap属性,只要其中一个设置为0dp,则边框为实线边框

    android:width="20dp"                               设置边边的宽度
    android:color="@android:color/black"  设置边边的颜色
    android:dashWidth="2dp"                         设置虚线的宽度
    android:dashGap="20dp"                          设置虚线的间隔宽度

    而且加的边宽度并不是从原来的图形最外圈算起,而是里外各占一半

    3.我们增加个渐变效果 gradient

    <?xml version="1.0" encoding="utf-8"?>
    <shape xmlns:android="http://schemas.android.com/apk/res/android" >
    
        <corners
            android:bottomLeftRadius="18dp"
            android:bottomRightRadius="30dp"
            android:radius="20dp"
            android:topLeftRadius="12dp"
            android:topRightRadius="24dp" />
    
        <stroke
            android:dashGap="8dp"
            android:dashWidth="4dp"
            android:width="20dp"
            android:color="#0000ff" />
        <gradient 
            android:startColor="#00ff00"
            android:centerColor="#ffff00"
            android:endColor="#00ffff"
            android:useLevel="true"
            android:angle="30"
            android:type="linear"
            android:gradientRadius="30"
            />
    
        <solid android:color="#ff0000" />
    
    </shape>

    运行上述代码报错

    原因

    angle = "30" 不是45倍数

    修改以后

    原因

    里面有solid填充属性,导致渐变效果无效

    去掉填充item项。然后我们研究 angle

    angle的值必须是45的倍数(包括0),仅在type="linear"有效

    看下面angle不同取值时候的效果

            

                        0                                                     45                                            90                                                135

          

                       180                                           225                                        270                                         315

    从上面的结果看,似乎没什么规律啊

    导致以上原因是我们对属性android:useLevel="true" 进行了设定

    如果我们把这个值设为false,就会发现它的线性规律是

    Z@QTDNQ0_9)0VFC5ZT8DT8B

    例如,当我们设置useLevel = "false", angle = 225

    其中,决定中间色位置的属性是

     android:centerX="50%"
     android:centerY="50%"

    对于其他属性

    看如下实例

    <gradient
            android:angle="225"
            android:centerColor="#00ff00"
            android:endColor="#0000ff"
            android:centerX="50%"
            android:centerY="50%"
            android:startColor="#ff0000"
            android:type="radial"
            android:gradientRadius="40"
            android:useLevel="false" />

    结果

    修改其中的属性,如下

    <gradient
            android:angle="225"
            android:centerColor="#00ff00"
            android:endColor="#0000ff"
            android:centerX="100%"
            android:centerY="50%"
            android:startColor="#ff0000"
            android:type="radial"
            android:gradientRadius="200"
            android:useLevel="false" />

    结果

    我们可以得出结论

            android:centerX="100%"
            android:centerY="50%"

    这两个属性是渐变的起点

    radial 这个是径向渐变

    我们在看下

    <gradient
            android:angle="225"
            android:centerColor="#00ff00"
            android:endColor="#0000ff"
            android:centerX="50%"
            android:centerY="50%"
            android:gradientRadius="200"
            android:startColor="#ff0000"
            android:type="sweep"
            android:useLevel="false" />
    结果

    我们可以发现,这时候的

    android:gradientRadius="200"

    已经不起作用了,但是

     android:centerX="50%"
     android:centerY="50%"

    作用还是一样的

    4.我们尝试更改下shape的大小size

    上面我们的大小没有设置,都是自适应控件大小的,现在我们修改如下

    测试控件

    <ImageButton
                android:id="@+id/bt"
                android:layout_width="200dp"
                android:layout_height="200dp"
               android:layout_centerInParent="true"
                android:background="#000000"
                android:src="@drawable/shape_test"
                android:text="current_line"
                android:textColor="#ff0000" />

    size大小设置

    <size
            android:height="100dp"
            android:width="100dp" />

    结果

    我们继续更改

    <size
            android:height="300dp"
            android:width="300dp" />

    当我们把控件设置为自适应的时候

    也就是说,这个属性相当于你做了一张图片,设置了这张图片的大小。

    5.我们现在看下padding的性质

    看对比

    <padding 
            
            android:left="100dp"
            android:top="20dp"
            android:bottom="20dp"
            android:right="20dp"
            />
    
        <size
            android:height="100dp"
            android:width="100dp" />


    结果

    但我们去掉padding的时候

    其实是没有什么区别的。网上有人说

    padding单独使用是没有效果的,必须是shape作为一个item的时候,使用才有效果。具体等以后用到再做调查吧

    
    
  • 相关阅读:
    字符串转换整数
    list、tuple、dict加*星号
    字符串
    整数反转
    字符串分割函数
    核密度图(直方图的拟合曲线)
    不同缺失值的删除方法
    Z字形变换
    最长回文字串
    寻找两个有序数组的中位数
  • 原文地址:https://www.cnblogs.com/zhangshuli-1989/p/zhangshuli_shape_15922151.html
Copyright © 2011-2022 走看看