Android Drawablw
作者:互联网
Android 几个常用Drawable的基本用法
引言
在大作业项目开发中,我想要实现一个类似下图的Botton背景转态变化,
通过查找资料得知要使用StateListDrawable的资源文件,
所以在这里总结一下StateListDrawable的基本用法,
并对其他几个常用drawable的进行简单介绍。
在讲StateListDrawable之前我们要先搞清楚什么是Drawable资源
Drawable资源
Drawable是Android应用中使用最广泛的资源,也是Android应用中最灵活的资源;
通俗点说就是我们在开发Android中需要用到的图片、背景、颜色、状态等等的资源文件
主要分为两种:
1.直接使用已有现成的图片资源,我们将这些放在AS的res/mipmap目录下
2.自己用XML编写的Drawable资源,我们将这种形式的Drawable放在res/drawable目录下,如下图所示,它Drawable有多个子类,用来实现不同的功能。
基本使用方法
1.在XML使用@drawable或者@mipmap来设置Drawable资源
2.在Java代码中则通过Resources提供的getDrawable(int id)的方法来获得Drawable资源
了解完Drawable,下面具体谈谈StateListDrawable的使用
StateListDrawable使用
基本描述:
StateListDrawable的作用就是使所显示的Drawable对象能够随着目标组件状态的改变而自动切换。
要定义StateListDrawable对象时,我们会使用<selector…/>标签作为根元素,在其中包含<item…/>用来表示状态属性
##简单示例
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed=["true"|"false"] android:drawable="@drawable/botton_pressed"/>
<item android:drawable="@drawable/botton_normal"/>
</selector>
可支持的状态属性:
state_focused: 是否处于已得到获得焦点状态
state_window_focused: 窗口是否处于已得到焦点状态
state_enabled: 是否处于可用状态
state_checkable: 是否处于可勾选状态
state_checked: 是否处于以勾选状态
state_selected: 是否处于已被选中状态
state_pressed: 是否处于已被按下状态
state_active: 是否处于激活状态,
state_first: 是否处于开始状态
state_middle: 是否处于中间状态
state_last: 是否处于结束状态
代码示例
我们就根据最开始的示例图,做一个按钮的背景状态切换
首先我们先做两个不同颜色的圆形背景图
1.在drawable目录下创建一个shape_btn_pressed.xml文件,写入下面的代码
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval">
<solid android:color="#ccf"/>
<corners android:radius="5dp"/>
<padding android:top="2dp" android:bottom="2dp"/>
</shape>
2.再创建一个shape_btn_none.xml的文件,复制上面的代码,将颜色更改为另一种颜色,好显示两种颜色状态。
3.在drawable目录下创建一个selector_btn.xml文件,写入下面的代码,设置按钮被按下时的drawable属性,即可看到按钮的状态变化。
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="false" android:drawable="@drawable/shape_btn_pressed"/>
<item android:state_pressed="true" android:drawable="@drawable/shape_btn_none"/>
</selector>
效果展示
讲完StateListDrawable,我们再来看一看ClipDrawable
ClipDrawable 资源
ClipDrawable就是从位图上剪下一个部分的图片片段,在XML文件中的根节点为
先看一下ClipDrawable的三个属性
-
clipOrietntion:设置剪切的方向,可以设置水平和竖直2个方向
-
gravity:从那个位置开始裁剪
设置gravity为top,从上至下加载。
设置gravity为bottom,从下至上加载。
设置gravity为center,从中间到四面八方加载。
设置gravity为center_horizontal,从中间到两边加载。
设置gravity为center_vertical,从中间到两边加载。
设置gravity为right,从右至左加载。
设置gravity为left,从左至右加载。 -
drawable:引用的drawable资源
ClipDrawable 对象可以调用setLevel(int level)方法来设置截取的区域大小 ,level可取0-10000之间,level为0,图片为空;level为10000时,图片全部截取。因此我们可以通过改变level值得方式,实现我们常见的进度条的效果。
代码示例
step1:先绘制一个进度条的图形资源progress_bar.xml,设置为一个矩形,添加圆角弧度
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<size
android:width="500dp"
android:height="25dp" />
<solid android:color="#00ff00" />
<corners android:radius="20dp" />
</shape>
step2:在drawable目录下新建一个clip标签的文件,设置gravity为left,使进度条从左至右加载
<clip xmlns:android="http://schemas.android.com/apk/res/android"
android:clipOrientation="horizontal"
android:drawable="@drawable/progress_bar"
android:gravity="left">
</clip>
step3:在布局文件中添加一个ImageView,同时要在src属性中设置我们step2中的文件,
一定要在src中,如果是blackground的话会报空指针的!
<ImageView
android:layout_margin="10dp"
android:background="#e6e6e6"
android:id="@+id/iv_image_clip_left"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:src="@drawable/clip_left_01"/>
step4:在java文件中动态设置level的值,达到进度条变化的效果
public class MainActivity extends AppCompatActivity {
private ImageView mClipLeftImageView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mClipLeftImageView = (ImageView) findViewById(R.id.iv_image_clip_left);
mClipLeftImageView.setImageLevel(10000);
handler.postDelayed(runnable,2000);
}
private int number = 0;
private Handler handler = new Handler();
Runnable runnable = new Runnable() {
@Override
public void run() {
if (number<=10000){
mClipLeftImageView.getDrawable().setLevel(number);
handler.postDelayed(runnable,20);
number+=100;
}
}
};
}
效果展示
这样我们就实现了一个简单的进度条效果,并且如果我们想要其他效果的进度条(比如从中间向两边,垂直的,等等)都可以通过修改gravity,clipOrientation的属性得到
看完上面两个drawable的例子,一定会发现我们都有用的标签的xml文件,其实这个就是shapeDrawable 资源,最后我们就再简单介绍一下shapeDrawable 资源
shapeDrawable 资源
shapeDrawable 资源比较简单,它就是用来定义一个基本的几何图形 ,根节点为,创建方法在上面的两个例子中已经提过
android:shape=["rectangel"|"oval"|"line"|"ring"] //指定定义哪种类型的图形(矩形,椭圆,线条等)
其次它包含多个子标签定义不同属性
1
corners子标签 :定几何图形四个角的弧度,仅适用于rectangle
android:radius="10dp" 圆角半径
android:bottomLeftRadius="10dp" 左下半角的圆角半径
android:bottomRightRadius="10dp"右下半角的圆角半径
android:topLeftRadius="10dp"左上半角的圆角半径
android:topRightRadius="20dp"右上半角的圆角半径
2
gradient子标签:定义使用渐变色填充
android:type 渐变的类型 分为下面三种
linear 线性渐变,默认的渐变类型
radial 放射渐变,设置该项时,android:gradientRadius也必须设置
sweep 扫描性渐变
android:startColor 渐变开始的颜色
android:endColor 渐变结束的颜色
android:centerColor 渐变中间的颜色
android:angle 渐变的角度,线性渐变时才有效,必须是45的倍数,0表示从左到右,90表示从下到上
android:centerX 渐变中心的相对X坐标,在0.0到1.0之间,默认为0.5,表示在正中间
android:centerY 渐变中心的相对X坐标,在0.0到1.0之间,默认为0.5,表示在正中间
android:gradientRadius 渐变的半径,只有渐变类型为radial时才使用
android:userLevel 如果为true,则可在LevelListDrawable中使用
3
padding子标签:定义几何形状的内边距
android:left 左边距
android:right 右边距
android:top 上边距
android:botton 下边距
4
size子标签:定义大小
5
solid子标签:定义使用单种颜色填充
只有一个color属性
6
stroke子标签:绘制边框
android:color 描边的颜色
android:width 描边的宽度
android:dashWidth 设置虚线时的横线长度
android:dashGap 设置虚线时的横线之间的距离
代码演示
shapeDrawable比较简单,我就演示一个放射填充的效果
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<gradient
android:gradientRadius="120dp"
android:centerX="0.5"
android:centerY="0.5"
android:centerColor="#4169E1"
android:endColor="#00FF7F"
android:startColor="#7FFF00"
android:type="radial"/>
</shape>
效果截图
作者:郑智强
标签:Drawablw,渐变,gravity,state,设置,Android,Drawable,android 来源: https://blog.csdn.net/fjnu_se/article/details/112230744