美文网首页
Android中Shape的属性说明及其使用(自定义View)

Android中Shape的属性说明及其使用(自定义View)

作者: nodzhang | 来源:发表于2018-06-30 15:54 被阅读49次

    shape是通过XMl绘制简单背景的方法,方便用于各种控件背景设置,用法简单,不占用内存。对于apk瘦身和减少内存占用有很大的帮助。下面来看看用法:

    1.新建shape文件

    首先在res/drawable文件夹下,新建一个shape文件,命名:shape_radius.xml

    <?xml version="1.0" encoding="utf-8"?> 
    <shape xmlns:android="http://schemas.android.com/apk/res/android" > 
        <corners android:radius="20dip"/> 
        <solid android:color="#ff00ff"/> 
    
    </shape> 
    

    后面会详细介绍标签含义和用法,这里先看效果。

    2.在视图中使用该shape

    用法很简单,在所在的视图中通过设置background属性的方式,添加background引用就行,代码示例:

     android:background="@drawable/shape_radius" 
    

    到此就完成了一个简单的使用过程。

    3.相关属性详解

    直接看代码示例

    <?xml version="1.0" encoding="utf-8"?>
    <shape xmlns:android="http://schemas.android.com/apk/res/android"
        android:dither="false|true"             //将在位图的像素配置与屏幕不同时(例如:ARGB 8888 位图和 RGB 565 屏幕)启用位图的抖动;值为“false”时则停用抖动。默认值为 true。
        android:shape="rectangle|line|oval|ring"//分别为矩形、线、椭圆、环。默认为矩形rectangle
        android:innerRadius="integer"           // shape为ring时可用,内环半径
        android:innerRadiusRatio="float"        // shape为ring时可用,内环的厚度比,即环的宽度比表示内环半径,默认为3,可被innerRadius值覆盖
        android:thickness="integer"             // shape为ring时可用,环的厚度
        android:thicknessRatio="float"          // shape为ring时可用,环的厚度比,即环的宽度比表示环的厚度,默认为9,可被thickness值覆盖
        android:tint="color"                    // 给shape着色
        android:tintMode="src_in|src_atop|src_over|add|multiply|screen" // 着色类型
        android:useLevel="false|true"           // 较少用,一般设为false,否则图形不显示。为true时可在LevelListDrawable使用
        android:visible="false|true" 
        >
        <!-- 圆角 -->
        <corners
            android:radius="integer"            // 圆角半径,该值设置时下面四个属性失效
            android:bottomLeftRadius="integer"  // 左下角圆角半径
            android:bottomRightRadius="integer" // 右下角圆角半径
            android:topLeftRadius="integer"     // 左上角圆角半径
            android:topRightRadius="integer"    // 右上角圆角半径
            />
        <!-- 渐变 -->
        <gradient
            android:useLevel="false|true"       // 与上面shape中该属性的一致
            android:type="linear|radial|sweep"  // 渐变类型,分别为线性、放射性、扫描性渐变,默认为线性渐变linear
            android:angle="integer"             // 渐变角度,当上面type为线性渐变linear时有效。角度为45的倍数,0度时从左往右渐变,角度方向逆时针
            android:centerColor="color"         // 渐变中间位置颜色
            android:startColor="color"          // 渐变开始位置颜色
            android:endColor="color"            // 渐变结束位置颜色
            android:centerX="float"             // type为放射性渐变radial时有效,设置渐变中心的X坐标,取值区间[0,1],默认为0.5,即中心位置
            android:centerY="float"             // type为放射性渐变radial时有效,设置渐变中心的Y坐标,取值区间[0,1],默认为0.5,即中心位置
            android:gradientRadius="integer"    // type为放射性渐变radial时有效,渐变的半径
            />
        <!-- 内边距 -->
        <padding
            android:bottom="integer"  // 设置底部边距
            android:left="integer"    // 左边边距
            android:right="integer"   // 右边
            android:top="integer"     // 顶部
        />
        <!-- 大小 -->
        <size
            android:height="integer"  // 宽度
            android:width="integer"   // 高度
            />
        <!-- 填充 -->
        <solid
            android:color="color"     // shape的填充色
            />
        <!-- 描边 -->
        <stroke
            android:color="color"       // 描边的颜色
            android:width="integer"     // 描边的宽度
            android:dashGap="integer"   // 虚线间隔
            android:dashWidth="integer" // 虚线宽度
        />
    </shape>
    

    3.1圆环案例

    这里因为设置了innerRadius属性和thickness属性具体值,所以innerRadiusRatio属性和thicknessRatio属性会被覆盖,可以删除,但记得添加useLevel属性并设为false,不然有可能图形不显示。

    <?xml version="1.0" encoding="utf-8"?>
    <shape xmlns:android="http://schemas.android.com/apk/res/android"
        android:shape="ring"
        android:innerRadius="50dp"
        android:innerRadiusRatio="5"
        android:thickness="120dp"
        android:thicknessRatio="8"
        android:useLevel="false"
        >
        <gradient
            android:type="linear"
            android:useLevel="false"
            android:angle="45"
            android:startColor="@color/colorAccent"
            android:centerColor="@android:color/black"
            android:endColor="@color/colorPrimary"/>
    </shape>
    
    圆环

    4.关闭硬件加速

    自定义的view渲染的时候,如果开启硬件加速,可能会渲染出错,需要关闭。
    通过代码在指定的view上关闭硬件加速:

    myView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
    

    直接在xml文件中关闭该view 的硬件加速:

    android:layerType="software"
    

    参考文章:
    Android中Shape的属性说明及其使用
    Android中shape属性详解

    相关文章

      网友评论

          本文标题:Android中Shape的属性说明及其使用(自定义View)

          本文链接:https://www.haomeiwen.com/subject/mabtuftx.html