一 drawable描述
控件的绘制 可以在android项目的drawable目录下 配置 xml文件进行drawable定义
以下是常用的drawable配置:
shape 控件的圆角 背景 渐变 边框的设置 对应的类注释中存在对应标签的属性
GradientDrawable绘制渐变
ShapeDrawable 绘制渐变,边框 颜色,圆角等
selector 控制不同状态下 控件的背景
StateListDrawable
layerlist 图片的叠加
LevelListDrawable
animation-list 逐帧动画
AnimationDrawable
bitmap 创建可拉伸的矢量图
BitmapDrawable
clip 剪切图像
ClipDrawable
二 对应drawable详解
1 shape配置
参考如下
2 selector配置
android:state_pressed=["true" | "false"] //被点击 android:state_focused=["true" | "false"] //获得焦点 android:state_selected=["true" | "false"] //被选中 android:state_checkable=["true" | "false"] //可以被check时 android:state_checked=["true" | "false"] //被check时,例如用于checkbox android:state_enabled=["true" | "false"] //可用时,即能接收click/touch事件 android:state_window_focused=["true" | "false"] //所在的窗口获得焦点
设置以上配置 可以当控件处于某种状态时显示某些背景
比如 在drawable下定义selector.xml内容如下:
<selector xmlns:android="http://schemas.android.com/apk/res/android"> <!-- 触摸屏或者鼠标按下时触发 松开后 开事件消失 --> <item android:drawable="@drawable/button2" android:state_pressed="true"></item> <!-- 获取焦点的事件 一般都用于文本框 --> <item android:drawable="@drawable/button1" android:state_focused="true"></item> <item android:state_focused="true" android:drawable="@drawable/button3"></item>
<!--这里表示默认的背景图片 一定要写在最下面 不然其他的状态都无效 --> <item android:drawable="@drawable/button3"></item> </selector>
在文本框控件中:
<EditText android:id="@+id/myText" android:layout_marginTop="10dp" android:background="@drawable/selector" android:layout_width="100dp" android:layout_height="50dp" android:layout_below="@id/btn1"/>
3 layerlist配置
可以将两张图片叠加作为背景显示
可以设置某些项的左右下上的距离
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" > <item> <bitmap android:src="@drawable/q1" android:antialias="true"/> </item>
<!--第二张图片离左边的距离为100dp bitmap默认会自动拉伸到控件的大小--> <item android:left="100dp"> <bitmap android:src="@drawable/ic_launcher" /> </item> </layer-list>
效果如下:
4 animation-list配置
drawable目录下定义myaimation.xml 内容如下:
<animation-list xmlns:android="http://schemas.android.com/apk/res/android" android:oneshot="false"> <item android:drawable="@drawable/q1" android:duration="150"/> <item android:drawable="@drawable/q2" android:duration="150"/> <item android:drawable="@drawable/q3" android:duration="150"/> <item android:drawable="@drawable/q4" android:duration="150"/> </animation-list>
这里 android:oneshot="false" true表示是否只循环一次 如果为false表示 一直循环播放
定义了4个item 当调用播放时 先显示@drawable/q1图片 150ms后 执行@drawable/q2
当q4执行完后150秒 循环又开始播放q1
布局中定义:
<ImageView android:id="@+id/abc" android:layout_width="fill_parent" android:layout_height="90dp" android:src="@drawable/myaimation" /> <Button android:id="@+id/btn" android:layout_width="100dp" android:layout_height="50dp" android:text="播放" android:layout_below="@id/abc"/> ImageView 用于播放指定的animation-list 点击按钮后触发事件:
ImageView iView=(ImageView)MainActivity.this.findViewById(R.id.abc); AnimationDrawable ad =(AnimationDrawable)iView.getDrawable(); ad.start();
4 bitmap配置
进行图片的一些简单操作 比如拉伸 滤波 去锯齿等
<bitmap xmlns:android="http://schemas.android.com/apk/res/android" android:src="@drawable/ic_launcher" --必须指定图片不能是xml文件 android:antialias="true" --锯齿 android:filter="true" --滤波 android:gravity="right" --右边对齐 >
如果ImageView设置为长度100dp bitmap本身设置的图片是50dp 那么图片会自动拉伸扩展到100dp 会出现模糊
可以使用android:gravity 表示图片不拉伸 自动填充到指定位置对齐 比如right 图片将位于控件右边 控件左边50dp就是空白
5 color配置
color标签是drawable里最简单的标签了,只有一个属性:android:color,指定颜色值。这个标签一般很少用,因为基本都可以通过其他更方便的方式定义颜色。另外,颜色值一般都在colors.xml文件中定义,其根节点为resources。看看两者的不同: <!-- 文件:res/drawable/white.xml --> <color xmlns:android="http://schemas.android.com/apk/res/android" android:color="#FFFFFF" /> <!-- 文件:res/values/colors.xml --> <resources> <color name="white">#FFFFFF</color> </resources> 引用的时候,前一种通过@drawable/white引用,后一种通过@color/white引用。
6 inset配置
<?xml version="1.0" encoding="utf-8"?> <inset xmlns:android="http://schemas.android.com/apk/res/android" android:visible="true" android:insetLeft="10dp" > <shape> <padding android:left="50dp"/> <solid android:color="@android:color/holo_orange_light" /> </shape> </inset>
inset 设置背景和控件的外边距 如果设置了 外边距就不会绘制背景图片 可以设置左右上下的距离
shape中的padding表示绘制内边距 这时内边距的部分也绘制了背景图片 这时光标就在内边距 +外边距之后
如果是 按钮 按钮的文本就鱼尾 外边距+内边距后面
图解:
文本框
按钮:
6 clip配置
使用剪切图像资源可以只显示一部分图像,这种资源经常被用在进度条的制作上。剪切图像资源是一个XML格式文件,资源只包含一个<clip>标签
举例:drawable下添加 myclip.xml
<?xml version="1.0" encoding="utf-8"?> <clip xmlns:android="http://schemas.android.com/apk/res/android" android:gravity="left" 从左边开始剪切
android:clipOrientation="horizontal" 水平剪切 android:drawable="@drawable/button5" 被剪切的背景图 > </clip>
ClipDrawable类内部预设了一个最大的level值10000 表示截取该图片的全部 如果设置为0 截取该图片的宽度为0 相当于背景图没有设置 这个参数只能在代码中设置
这里在布局文件中 添加一个父容器 设置背景图 在Button上设置剪切
<LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:background="@drawable/button2" android:layout_marginTop="10dp"> <Button android:id="@+id/btn22" android:layout_width="fill_parent" android:layout_height="50dp" android:layout_below="@id/myText1" android:background="@drawable/myclipe" /> </LinearLayout>
如果 代码设置
ClipDrawable cd=(ClipDrawable)(((Button)findViewById(R.id.btn22)).getBackground()); cd.setLevel(10000);//设置为最大值1000 LinearLayout 的背景图被完全覆盖了
如果设置为
cd.setLevel(5000);
截取 一半的图像显示 左边一半就是clip指定的图像的一半 右边显示LinearLayout一半的图像
7 scale配置
使用scale标签可以对drawable进行缩放操作,和clip一样是通过设置level来控制缩放的比例
android:drawable 指定drawable资源,如果不设置该属性,也可以定义drawable类型的子标签 android:scaleHeight 设置可缩放的最大高度,用百分比表示,格式为XX%,0%表示不做任何缩放,50%表示只能缩放一半 缩放设置的level超过了这个百分比无法缩放 android:scaleWidth 设置可缩放的最大宽度,用百分比表示,格式为XX%,0%表示不做任何缩放,50%表示只能缩放一半 android:scaleGravity 设置drawable缩放后的位置,取值和bitmap标签的一样,就不一一列举说明了,不过默认值是left android:useIntrinsicSizeAsMinimum 设置drawable原有尺寸作为最小尺寸,设为true时,缩放基本无效,API Level最低要求为11
举例
drawable添加myscale.xml文件
<scale android:drawable="@drawable/button5" android:scaleWidth="0%" --表示水平不能缩放 就算设置了level也无效 android:scaleHeight="80%" --表示高度 设置level不能缩放超过80% xmlns:android="http://schemas.android.com/apk/res/android"> </scale>
布局文件
<EditText android:id="@+id/myText1"android:background="@drawable/myscale" android:layout_width="fill_parent" android:layout_height="50dp" android:layout_below="@id/myText"/>
在java代码中设置level level的范围是 【0-10000】
findViewById(R.id.myText1).getBackground().setLevel(8000);
这里 水平 比例 8000/10000 缩放了80% 超过了最大 0%无法缩放 就是拉伸填充原始宽度
高度 8000/10000 缩放了80% 等于最大值 80% 自动缩放高度到原始高度的80%
宽度没有缩放 高度黑色的部分缩放了
7 rotate配置
使用rotate标签可以对一个drawable进行旋转操作,在shape篇讲环形时最后举了个进度条时就用到了rotate标签。另外,比如你有一张箭头向上的图片,但你还需要一个箭头向下的图片,这时就可以使用rotate将向上的箭头旋转变成一张箭头向下的drawable。 先看看rotate标签的一些属性吧: android:drawable 指定drawable资源,如果不设置该属性,也可以定义drawable类型的子标签 android:fromDegrees 起始的角度度数 android:toDegrees 结束的角度度数,正数表示顺时针,负数表示逆时针 android:pivotX 旋转中心的X坐标,浮点数或是百分比。浮点数表示相对于drawable的左边缘距离单位为px,如5; 百分比表示相对于drawable的左边缘距离按百分比计算,如5%; 另一种百分比表示相对于父容器的左边缘,如5%p; 一般设置为50%表示在drawable中心 android:pivotY 旋转中心的Y坐标 android:visible 设置初始的可见性状态,默认为false 示例代码如下,目标是将一张箭头向上的图片转180度,转成一张箭头向下的图片: <?xml version="1.0" encoding="utf-8"?> <rotate xmlns:android="http://schemas.android.com/apk/res/android" android:drawable="@drawable/ic_arrow" android:fromDegrees="0" android:pivotX="50%" android:pivotY="50%" android:toDegrees="180" />
如果使用以上设置没有任何效果不会旋转 如果单纯只是旋转 只需要设置fromDegrees这个参数的角度 就可以旋转指定的角度
android:pivotX 表示旋转角度的x坐标 50%为控件宽度的50%
如果需要android:toDegrees 有效果 必须代码 设置level属性 [0-10000]
如果设置为 5000 旋转的长度 等于 5000/1000 *(180-0)