概述
用代码生成图片,而且图片能随意的更改,既方便又节省空间,下面就介绍用shape生成自定义图形的方法
使用方式
在res/drawable目录下新建一个xml文件;
在代码中引用这个xml文件,引用方式和图片一样。
shape图形的属性认识
xmlns:android="http://schemas.android.com/apk/res/android" android:shape=["rectangle" | "oval" | "line" | "ring"] //共有4种类型,矩形(默认)/椭圆形/直线形/环形 // 以下4个属性只有当类型为环形时才有效 android:innerRadius="dimension" //内环半径 android:innerRadiusRatio="float" //内环半径相对于环的宽度的比例,比如环的宽度为50,比例为2.5,那么内环半径为20 android:thickness="dimension" //环的厚度 android:thicknessRatio="float" //环的厚度相对于环的宽度的比例 android:useLevel="boolean"> //如果当做是LevelListDrawable使用时值为true,否则为false. android:radius="dimension" //全部的圆角半径 android:topLeftRadius="dimension" //左上角的圆角半径 android:topRightRadius="dimension" //右上角的圆角半径 android:bottomLeftRadius="dimension" //左下角的圆角半径 android:bottomRightRadius="dimension" /> //右下角的圆角半径 android:type=["linear" | "radial" | "sweep"] //共有3中渐变类型,线性渐变(默认)/放射渐变/扫描式渐变 android:angle="integer" //渐变角度,必须为45的倍数,0为从左到右,90为从上到下 android:centerX="float" //渐变中心X的相当位置,范围为0~1 android:centerY="float" //渐变中心Y的相当位置,范围为0~1 android:startColor="color" //渐变开始点的颜色 android:centerColor="color" //渐变中间点的颜色,在开始与结束点之间 android:endColor="color" //渐变结束点的颜色 android:gradientRadius="float" //渐变的半径,只有当渐变类型为radial时才能使用 android:useLevel=["true" | "false"] /> //使用LevelListDrawable时就要设置为true。设为false时才有渐变效果 android:left="dimension" android:top="dimension" android:right="dimension" android:bottom="dimension" /> android:width="dimension" android:height="dimension" /> android:color="color" /> android:width="dimension" //描边的宽度 android:color="color" //描边的颜色 // 以下两个属性设置虚线 android:dashWidth="dimension" //虚线的宽度,值为0时是实线 android:dashGap="dimension" /> //虚线的间隔
图像案例
空心圆角矩形
drawable下shape的xml文件:
android:shape="rectangle"> android:width="@dimen/dp_1" android:color="@color/c_ffffa543" />
布局使用
android:id="@+id/et_photo_describe" android:layout_width="match_parent" android:layout_height="@dimen/dp_112" android:layout_below="@id/tv_photo_index" android:layout_marginTop="@dimen/dp_10" android:background="@drawable/bg_d_sp_photo_describe" android:gravity="left|top" android:hint="@string/text_hint_photo_describe" android:paddingLeft="@dimen/dp_10" android:paddingTop="@dimen/dp_5" android:paddingRight="@dimen/dp_10" android:textColorHint="@color/c_d7d7d9" android:textSize="@dimen/sp_15" /> 效果图: image.png 横线虚线 drawable下shape的xml文件: android:shape="line"> android:width="1dp" android:color="@color/c_ffff9103" android:dashWidth="8dp" android:dashGap="4dp" /> 布局使用 android:layerType="none" android:id="@+id/v_line" android:layout_width="match_parent" android:layout_height="@dimen/dp_2" android:layout_below="@id/tv_vote_info_content" android:layout_marginTop="@dimen/dp_25" android:background="@drawable/bg_d_sp_dotted_line_orange" /> 效果图: image.png 注意事项: 需要关闭硬件加速!!! 竖线虚线 分析: android中的shape的绘制线条,直接绘制只能是横线,那么要绘制竖线需要将横线旋转90度才能实现竖线的效果 实现步骤: layer-list节点中指定使用多重效果叠加 item节点中指定一个可以显示的内容 rotate节点指定条目旋转 fromDegrees属性指定旋转的其实角度 toDegrees属性指定旋转的终止角度 visible属性指定为可见 shape 节点中指定shape属性为线条line stroke节点指定线 的属性 width指定线的宽度 color指定线的颜色 dashGap指定虚线的间隔 dashWidth指定小线段的长度 注意事项: Android 3.0 (API level 11), 开始支持 所有的View 的canvas都会使用GPU,但是硬件的加速会占有一定的RAM。 在API >= 14上,默认是开启的,如果你的应用只是标准的View和Drawable,全局都打开硬件加速,是不会有任何问题的。 然而,硬件加速并不支持所有的2D画图的操作,这时开着它,可能会影响到你的自定义控件或者绘画,出现异常等行为, 所以android对于硬件加速提供了可选性 如果你的应用执行了自定义的绘画,可以通过在真机上测试开启硬件加速查找问题 需要关闭硬件加速功能,硬件加速的级别 Application android:hardwareAccelerated="false" ...> 可以直接在activity做如何下配置: android:name=".wallet.BuyFlowersActivity" android:hardwareAccelerated="false" /> Window getWindow().setFlags( WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED, WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED); 如果activity中关闭硬件加速可能会引发其他UI组件无法正常显示,可以在布局中将指定控件android:layerType="none"关闭硬件加速. android:layerType="none" android:id="@+id/v_line" android:layout_width="match_parent" android:layout_height="@dimen/dp_2" android:layout_below="@id/tv_vote_info_content" android:layout_marginTop="@dimen/dp_25" android:background="@drawable/bg_d_sp_dotted_line_orange" /> 也可以在代码中关闭 myView.setLayerType(View.LAYER_TYPE_SOFTWARE, null); 两种获取是否支持硬件加速的方式 //returns true if the View is attached to a hardware accelerated window. View.isHardwareAccelerated() //returns true if the Canvas is hardware accelerated Canvas.isHardwareAccelerated() 完整代码 android:left="-300dp" android:right="-300dp"> android:fromDegrees="90" android:visible="true"> android:width="1dp" android:color="@color/c_ffffff" android:dashGap="4dp" android:dashWidth="8dp" /> 效果图: image.png