Android常见Drawable使用

Android中常用的Drawable的用法

    在Android中,Drawable是一个抽象类,代表的是一种图像的概念,官方介绍它是一种
可以绘制的东西的一般抽象,一张图片,一种颜色都是一个Drawable。

Drawable的实现类有多种,常见的有ShapeDrawable、LayerDrawable…每一种都代表一种类型的Drawable,Drawable经常被当做View的背景来使用,可以在XML文件中定义,也可以在代码中生成, 只不过在代码中步骤较为繁琐,所以一般直接在XML文件中定义。

Drawable使用简单,功能强大,熟练掌握各种Drawable的使用可以方便我们做出一些特殊的UI效果,所以了解各种Drawable的用法还是很有必要的

BitmapDrawable

在BitmapDrawable代表的一张图片,当然我们也可以直接去引用图片就好,但是使用BitmapDrawable的话可以方便我们对图片进行更多操作

在XML文件中定义:

<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
android:src="@mipmap/preview"
android:gravity="fill_vertical"
android:antialias="true"
android:filter="true"
android:dither="true"
/>

  • src: 图片的资源ID
  • filter: 开启过滤效果,在图片被拉伸的时候保存好的显示效果
  • dither: 开启图片的抖动效果,开启这个效果可以使高分辨率的图片在低分辨率的手机上有一个比较好的显示效果。
  • antialias: 开启图片的抗锯齿功能
  • gravity: 图片的显示位置,属性值:top,left,right,bottom,center…

StateListDrawable

对应XML中的selector,是一个Drawable集合,每个Drawable对应View的不同状态,经常用于那些可交互的View的背景

常见View的状态

android.R.styleable#DrawableStates_state_focused 获取焦点
android.R.styleable#DrawableStates_state_enabled 可用状态
android.R.styleable#DrawableStates_state_checkable 是否可以选择
android.R.styleable#DrawableStates_state_checked 选中状态(CheckBox)
android.R.styleable#DrawableStates_state_selected 选择状态
android.R.styleable#DrawableStates_state_pressed 按下状态,未松开

在XML文件中定义:

<selector xmlns:android="http://schemas.android.com/apk/res/android"
android:constantSize="true"
android:dither="true"
android:variablePadding="true">
<item android:drawable="@drawable/ic_preview2" android:state_pressed="true" />
<item android:drawable="@drawable/ic_preview" />
</selector>

  • constantSize: 是否是否固定Drawable的大小,因为不同View状态对应的Drawable可能大小不一,设置TRUE的话就会取Drawable集合中固有大小最大值,默认值为FALSE
  • dither: 设置是否开启抖动效果
  • variablePadding: 设置Drawable的padding属性是否随着状态改变而改变,默认为FALSE

ShapeDrawable

ShapeDrawable表示的是一种图形,可以是纯色的图形,也可以是渐变效果的图形,这在日常开发中时很常见的

在XML文件中定义:

<shape
xmlns:android="http://schemas.android.com/apk/res/android" android:shape="ring">
<solid android:color="@color/colorAccent" />
<corners android:radius="5dp" />
<padding
android:bottom="5dp"
android:right="5dp"
android:left="5dp"
android:top="5dp" />
<size android:height="10dp" android:width="10dp"/>
<stroke android:color="@color/colorPrimary" android:width="1dp"/>
</shape>

  • shape: 图形的形状,四个选项:rectangle(矩形),ring(圆环),oval(椭圆),line(线)
  • solid: 填充的颜色,纯色填充,与gradient互斥
  • padding: 这个表示的是包含它的View中的空白处
  • size: 表示的当前shape的固有大小,对于shape其实没有大小的概念,它作为View的背景会适应View的大小,Drawable中可以通过getIntrinsicHeight(),getIntrinsicWidth()获取
  • corners: 适用于矩形,设置圆角的程度
  • stroke: 设置shape的描边,有color、width、dashWidth、dashGap属性,可以通过dashWidth,dashGap设置虚线效果,但是这两个属性任何一个为0虚线效果就不生效
  • gradient: 设置渐变效果,angle:渐变的角度,默认为0,必须为45倍数,centerX,centerY:渐变中心店的坐标,startColor:渐变开始颜色,centerColor:渐变中间颜色,endColor:渐变结束颜色,gradientRadius:渐变半径,type:渐变类型(linear:线性渐变,radial:镭射渐变,sweep:扫描渐变)

LayerDrawable

对应XML中的<layer-list>标签,表示的是一种层级化的Drawable集合,就是将不同的Drawable一层一层叠加

在XML文件中定义:

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:bottom="1dp">
<shape android:shape="rectangle">
<solid android:color="#00cc99" />
</shape>
</item>
</layer-list>

  • top,right,bottom,left:相对于View各个方向的偏移量
  • drawable: 直接应用一个Drawable资源
  • item: 每一个Item都是一个Drawable

TransitionDrawable

对应XML文件中的<transition>标签,用于实现两个Drawable之间的淡入淡出的效果

在XML文件中定义:

<transition xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@mipmap/preview2" />
<item android:drawable="@mipmap/preview" />
</transition>

XML布局中比较简洁,要实现淡入淡出的效果还需要在代码中通过startTransition(时长)开启

示例:
给TextView设置transitionXML文件背景

TextView tv = findViewById(R.id.tv_transition);
TransitionDrawable transitionDrawable = (TransitionDrawable) tv.getBackground();
transitionDrawable.startTransition(2000);

猜你喜欢

转载自blog.csdn.net/swollow_/article/details/80751972