您的位置:首页 > 移动开发 > Android开发

Android Drawable

2015-12-01 21:59 567 查看

Android Drawable

标签(空格分隔): Android

Android的drawable有很多种类型,



Bitmap File

Nine-Patch File

Layer List

State List

Level List

Transition Drawable

Inset Drawable

Clip Drawable

Scale Drawable

Shape Drawable



Bitmap Xml

bitmap标签的一般格式为:

<?xml version="1.0" encoding="utf-8"?>
<bitmap
xmlns:android="http://schemas.android.com/apk/res/android"
android:src="@[package:]drawable/drawable_resource"
android:antialias=["true" | "false"]
android:dither=["true" | "false"]
android:filter=["true" | "false"]
android:gravity=["top" | "bottom" | "left" | "right" | "center_vertical" |
"fill_vertical" | "center_horizontal" |  "fill_horizontal" |
"center" | "fill" | "clip_vertical" | "clip_horizontal"]
android:mipMap=["true" | "false"]
android:tileMode=["disabled" | "clamp" | "repeat" | "mirror"]
android:tint="@[package:]color/color_resource"
android:tintMode=["add" | "multyplay" | "screen" | "src_atop" | "src_in" | "src_over"]/>

src:必须的属性,可以是一个drawable资源。

filter:如果设为true,适应View的大小而拉伸。

gravity:在View中的位置。

tileMode, tileModeX, tielModeY:平铺形式,设置平铺之后,filter和gravity失效。

tint:可以理解为给图片染色。应用中有些图片是纯色的,可以只切一张白色的图,然后加入不同的tint。比起去切图更方便,而且白色图片的体积更小。特别是应用图标需要随着主题变颜色的时候。

tintMode:一般使用src_top。

不同的tintMode产生的结果,原图是origin,tint是蓝色



后来才发现,tint这个属性在API Guide里面并没有提到,因为这个在5.0以下是不支持的,不会报错,但是不会有tint的效果。但是我们可以这么做:

drawable = DrawableCompat.wrap(drawable);
DrawableCompat.setTint(drawable, color);

先取出drawable,然后设置tint,再设置回去。

State-list

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"
android:constantSize=["true" | "false"]
android:dither=["true" | "false"]
android:variablePadding=["true" | "false"] >
<item
android:drawable="@[package:]drawable/drawable_resource"
android:state_pressed=["true" | "false"]
android:state_focused=["true" | "false"]
android:state_hovered=["true" | "false"]
android:state_selected=["true" | "false"]
android:state_checkable=["true" | "false"]
android:state_checked=["true" | "false"]
android:state_enabled=["true" | "false"]
android:state_activated=["true" | "false"]
android:state_window_focused=["true" | "false"] />
</selector>


Layer List

<?xml version="1.0" encoding="utf-8"?>
<layer-list
xmlns:android="http://schemas.android.com/apk/res/android" >
<item
android:drawable="@[package:]drawable/drawable_resource"
android:id="@[+][package:]id/resource_name"
android:top="dimension"
android:right="dimension"
android:bottom="dimension"
android:left="dimension" />
</layer-list>

当把
layer-list
作为
ImageView
src
使用的时候,配合
scaleType
可以让里面的图片不被拉伸。当把
layer-list
作为
background
使用的时候,如果直接把图片放在
item
drawable
里面,会被拉伸,为了防止拉伸,可以在
drawable
里面放上
bitmap
的xml资源,或者在
item
里面包一层
bitmap
,比如:

<item
android:left="0dp"
android:top="0dp">
<bitmap
android:gravity="center"
android:src="@drawable/ic_launcher"
android:alpha="0.5"
android:tint="#0f0"/>
</item>

item
里面也可以是
selector
,这样,在一个background里面就可以有多个触摸反馈。简单的应用场景可以是这样的,一个button,不点击的时候是背景是的绿色,中间一个圆形的灰色,点击之后变为背景是红色,中间变为蓝色多的方形。像这种需要多个变化的背景,用layer-list就可以很方便的解决,不需要设计出图,有利于减小安装包的大小。

color-list

作用和用法类似于state-list,格式为:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
<item
android:color="hex_color"
android:state_pressed=["true" | "false"]
android:state_focused=["true" | "false"]
android:state_selected=["true" | "false"]
android:state_checkable=["true" | "false"]
android:state_checked=["true" | "false"]
android:state_enabled=["true" | "false"]
android:state_window_focused=["true" | "false"] />
</selector>

基本上只是把
item
里面的
drawable
改为了
color
。与state-list最大的区别就是,state-list得到的是
drawable
资源文件,而color-list得到的是
color
资源文件。可以直接给
textColor
使用,这样就可以在点击的时候改变字体颜色。

Transition Drawable

<?xml version="1.0" encoding="utf-8"?>
<transition
xmlns:android="http://schemas.android.com/apk/res/android" >
<item
android:drawable="@[package:]drawable/drawable_resource"
android:id="@[+][package:]id/resource_name"
android:top="dimension"
android:right="dimension"
android:bottom="dimension"
android:left="dimension" />
</transition>

一般是设置两个
item
,通过View的方法,获取到
drawable
,然后调用
startTrasition(int)
drawable
会从第一个
item
渐变到第二个
item
,但是第一个
item
并没有消失,第二个
item
的应该是调整
alpha
值从0到1。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: