Drawable分類
1.BitmapDrawable
一般開發中直接引用圖片即可,但也可以通過XML的方式來描述它,可以設置更多的效果。
<?xml version="1.0" encoding="utf-8"?>
<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
android:antialias="true"
android:dither="true"
android:gravity="center"
android:mipMap="true"
android:filter="true"
android:src="@drawable/ic_launcher"
android:tileMode="disabled" >
</bitmap>
android:antialias
是否開啓抗鋸齒。開啓使圖片變得平滑。
android:dither
是否開啓抖動效果。讓高質量的圖片在低質量的屏幕上還能保持較好的顯示效果。
android:filter
是否開啓過濾效果。圖片尺寸被拉伸或壓縮時,可以保持較好的顯示效果。
android:mipMap(mipMap在API18以上)
紋理映射。圖像相關的處理技術,不常用。
android:tileMode
平鋪模式。[“disabled”|”clamp”|”repeat”|”mirror”],disabled:關閉平鋪模式,開啓平鋪後android:gravity屬性會被忽略。repeat:水平和豎直方向的平鋪,mirror:水平和豎直方向鏡面投影效果,clamp:圖片四周的圖像會擴展到周圍區域。
repeat
mirror
NinePathDrawable
表示一張.9圖。
<?xml version="1.0" encoding="utf-8"?>
<nine-patch xmlns:android="http://schemas.android.com/apk/res/android"
android:dither="true"
android:src="@drawable/ic_launcher" >
</nine-patch>
ShapeDrawable
通過顏色來構造圖形,即可是純色,也可是漸變效果。
LayerDrawable
對應xml標籤是,表示一種層次化的Drawable集合。
<?xml version="1.0" encoding="UTF-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<!-- 連框顏色值 -->
<item
android:bottom="0dp"
android:left="0dp"
android:right="1dp"
android:top="0dp">
<shape>
<corners android:radius="3dp" />
<gradient
android:angle="270"
android:endColor="#FFFFFF"
android:startColor="#EEEEEE" />
</shape>
</item>
<!-- 主體背景顏色值 -->
<item
android:bottom="0dp"
android:left="0dp"
android:right="0dp"
android:top="0dp">
<shape>
<corners android:radius="3dp" />
<stroke
android:width="1dp"
android:color="#E8E9E9" />
</shape>
</item>
</layer-list>
StateListDrawable
對應標籤
LeverListDrawable
<?xml version="1.0" encoding="utf-8"?>
<level-list xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:drawable="@drawable/garland_gray"
android:maxLevel="0" />
<item
android:drawable="@drawable/garland_yellow"
android:maxLevel="1" />
<item
android:drawable="@drawable/garland_blue"
android:maxLevel="2" />
</level-list>
通過下邊代碼設置選中對應等級的Drawable。
imageView.getDrawable().setLevel(1);
TransitionDrawable
對應標籤。用於實現兩個Drawable之間的淡入淡出效果
<?xml version="1.0" encoding="utf-8"?>
<transition xmlns:android="http://schemas.android.com/apk/res/android" >
<item android:drawable="@drawable/edge_green"/>
<item android:drawable="@drawable/edge_purple"/>
</transition>
通過下邊代碼設置
TransitionDrawable drawable = (TransitionDrawable) tv.getBackground();
drawable.startTransition(5000);//開啓效果
drawable.reverseTransition(5000);//逆過程
InsetDrawable
對應標籤
<?xml version="1.0" encoding="utf-8"?>
<inset xmlns:android="http://schemas.android.com/apk/res/android"
android:insetBottom="15dp"
android:insetLeft="15dp"
android:insetRight="15dp"
android:insetTop="15dp" >
<shape android:shape="rectangle" >
<solid android:color="#ff0000" />
</shape>
</inset>
ScaleDrawable
對應標籤,可以根據自己的等級(level)將指定的Drawable縮放到一定比例。
<?xml version="1.0" encoding="utf-8"?>
<scale xmlns:android="http://schemas.android.com/apk/res/android"
android:drawable="@drawable/ic_launcher"
android:scaleGravity="center"
android:scaleHeight="25%"
android:scaleWidth="25%" >
</scale>
但是直接使用上面的Drawable資源是不行的,必須設置ScaleDrawable的等級0-10000之間的值,如下:
ScaleDrawable scaleDrawable = (ScaleDrawable) view.getBackground();
scaleDrawable.setLevel(1);
ClipDrawable
對應標籤,根據自己當前等級來裁剪另一個Drawable。
<?xml version="1.0" encoding="utf-8"?>
<clip xmlns:android="http://schemas.android.com/apk/res/android"
android:clipOrientation="vertical"
android:drawable="@drawable/ic_launcher"
android:gravity="bottom" >
</clip>
裁剪方向通過android:clipOrientation和android:gravity共同控制。上邊表示從上往下豎直裁剪。
ClipDrawable clipDrawable=(ClipDrawable) iv.getDrawable();
clipDrawable.setLevel(5000);
level從0-10000,0表示完全裁剪,10000表示不裁剪,5000表示裁剪一半。
自定義Drawable
public class CustomDrawable extends Drawable {
private Paint mPaint;
public CustomDrawable(int color) {
mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mPaint.setColor(color);
}
@Override
public void draw(Canvas canvas) {
Rect r = getBounds();
float cX = r.exactCenterX();
float cY = r.exactCenterY();
canvas.drawCircle(cX, cY, Math.min(cX, cY), mPaint);
}
@Override
public int getOpacity() {
return PixelFormat.TRANSLUCENT;
}
@Override
public void setAlpha(int alpha) {
mPaint.setAlpha(alpha);
invalidateSelf();
}
@Override
public void setColorFilter(ColorFilter colorFilter) {
mPaint.setColorFilter(colorFilter);
invalidateSelf();
}
}