Android中Drawable小结
Drawabe是可绘制到屏幕上图形一种概述,屏幕上绘制的图形内容都会最终已Drawable形式提供,Drawable提供了多种展示形式,如下:
Bitmap: the simplest Drawable, a PNG or JPEG or,GIF image. -->BitmapDrawable
Nine Patch: an extension to the PNG format allows it to specify information about how to stretch it and place things inside of it. -->NinePatchDrawable
Shape: contains simple drawing commands instead of a raw bitmap, allowing it to resize better in some cases. -->ShapeDrawable xml<shape>
Layers: a compound drawable, which draws multiple underlying drawables on top of each other. -->LayerDrawable xml<layer-list>
States: a compound drawable that selects one of a set of drawables based on its state. -->StateListDrawable xml
<
selector
>
Levels: a compound drawable that selects one of a set of drawables based on its level.
-->
LevelListDrawable xml<level-list>
Scale: a compound drawable with a single child drawable, whose overall size is modified based on the current level. -->ScaleDrawable xml<scale>
XML Bitmap:使用xml方式处理Bitmap,例如小图平铺背景
xml定义
<?xml version="1.0" encoding="utf-8"?> <bitmap xmlns:android="http://schemas.android.com/apk/res/android" android:src="@drawable/icon" android:tileMode="repeat" />
titleMode为Bitmap重复填充方式,tileMode="clamp
"填充边缘色
XML Nine-Patch:
<?xml version="1.0" encoding="utf-8"?> <nine-patch xmlns:android="http://schemas.android.com/apk/res/android" android:src="@[package:]drawable/drawable_resource" android:dither=["true" | "false"] />
LayerDrawable:管理一组drawable显示处理,例如:叠加图形的展示
xml定义:
<?xml version="1.0" encoding="utf-8"?> <layer-list xmlns:android="http://schemas.android.com/apk/res/android"> <item> <bitmap android:src="@drawable/android_red" android:gravity="center" /> </item> <item android:top="10dp" android:left="10dp"> <bitmap android:src="@drawable/android_green" android:gravity="center" /> </item> <item android:top="20dp" android:left="20dp"> <bitmap android:src="@drawable/android_blue" android:gravity="center" /> </item> </layer-list>
layer-list阴影效果:
<?xml version="1.0" encoding="utf-8"?> <layer-list xmlns:android="http://schemas.android.com/apk/res/android"> <!--底层阴影--> <!--top代表下边的阴影高度,left代表右边的阴影宽度 如果不做这个控制,底层和上层的左上会重合在一起--> <item android:left="2dp" android:top="2dp"> <shape android:shape="rectangle"> <!--使用渐变色处理阴影色度 angle 0 左边;90 下边,180,右边,270 上边--> <gradient android:angle="270" android:endColor="#0F000000" android:startColor="#0F000000"/> <corners android:radius="8dp"/> </shape> </item> <!-- 上层背景部分 上层的右边距离底层的右边3,距离底层底部3dp--> <item android:bottom="3dp" android:right="3dp"> <shape android:shape="rectangle"> <corners android:radius="8dp"/> </shape> </item> </layer-list>
可参考:https://blog.csdn.net/android_cmos/article/details/80033784
StateListDrawable:根据View的状态来展示不同状态下的Drawable
xml文件:
<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_pressed="true" android:drawable="@drawable/button_pressed" /> <!-- pressed --> <item android:state_focused="true" android:drawable="@drawable/button_focused" /> <!-- focused --> <item android:state_hovered="true" android:drawable="@drawable/button_focused" /> <!-- hovered --> <item android:drawable="@drawable/button_normal" /> <!-- default --> </selector>
LevelListDrawable:展示几张图形,使用setLevel() or setImageLevel()
来展示不同Drawable
xml定义:
<?xml version="1.0" encoding="utf-8"?> <level-list xmlns:android="http://schemas.android.com/apk/res/android" > <item android:drawable="@drawable/status_off" android:maxLevel="0" /> <item android:drawable="@drawable/status_on" android:maxLevel="1" /> </level-list>
TransitionDrawable:限制两个Drawable,淡入淡出效果过度展示
xml定义:
<?xml version="1.0" encoding="utf-8"?> <transition xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@drawable/on" /> <item android:drawable="@drawable/off" /> </transition>
使用:
ImageButton button = (ImageButton) findViewById(R.id.button); TransitionDrawable drawable = (TransitionDrawable) button.getDrawable(); drawable.startTransition(500);
InsetDrawable:嵌入到另一个Drawable里,指定边距区域显示,例如:背景区域小于内容区可使用
xml文件:
<?xml version="1.0" encoding="utf-8"?> <inset xmlns:android="http://schemas.android.com/apk/res/android" android:drawable="@drawable/drawable_resource" android:insetTop="dimension" android:insetRight="dimension" android:insetBottom="dimension" android:insetLeft="dimension" />
ScaleDrawable:对Drawable的尺寸进行拉伸处理
xml定义:
<?xml version="1.0" encoding="utf-8"?> <scale xmlns:android="http://schemas.android.com/apk/res/android" android:drawable="@drawable/logo" android:scaleGravity="center_vertical|center_horizontal" android:scaleHeight="80%" android:scaleWidth="80%" />
ClipDrawable:裁剪处理
<?xml version="1.0" encoding="utf-8"?> <clip xmlns:android="http://schemas.android.com/apk/res/android" android:drawable="@drawable/android" android:clipOrientation="horizontal" android:gravity="left" />
/** * Drawable转化为Bitmap */ public static Bitmap drawableToBitmap(Drawable drawable) { int width = drawable.getIntrinsicWidth(); int height = drawable.getIntrinsicHeight(); Bitmap bitmap = Bitmap.createBitmap(width, height, drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888 : Bitmap.Config.RGB_565); Canvas canvas = new Canvas(bitmap); drawable.setBounds(0, 0, width, height); drawable.draw(canvas); return bitmap; } /** * Bitmap to Drawable * @param bitmap * @param mcontext * @return */ public static Drawable bitmapToDrawble(Bitmap bitmap,Context mcontext){ Drawable drawable = new BitmapDrawable(mcontext.getResources(), bitmap); return drawable; }