日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

Android各种各样的Drawable-更新中

發(fā)布時(shí)間:2025/3/21 49 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android各种各样的Drawable-更新中 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

概述

2D繪圖

通常情況下,我們很少直接使用Drawable的實(shí)現(xiàn)類,大部分的情況下還是使用xml的方式進(jìn)行開發(fā)。只有在程序中需要?jiǎng)討B(tài)的修改drawable的屬性時(shí),才需要使用具體的drawable類型提供的方法。

事實(shí)上xml中配置的節(jié)點(diǎn)和Drawable的實(shí)現(xiàn)類是一一對(duì)應(yīng)的。


Android 在android.graphics.drawable包中提供了了很多Drawable抽象類的實(shí)現(xiàn)類:ColorDrawable、GradientDrawable、BitmapDrawable、 NinePatchDrawable、InsetDrawable、ClipDrawable、ScaleDrawable、RotateDrawable、AnimationDrawable、LayerDrawable、LevelListDrawable、StateListDrawable、TransitionDrawable等等


ElementClassDescription
<animated-rotate>AnimatedRotateDrawableA Drawable that can animate a rotation of another Drawable.
<animation-list>AnimationDrawableAn object used to create frame-by-frame animations, defined by a series of Drawable objects, which can be used as a View object’s background.
<bitmap>BitmapDrawableA Drawable that wraps a bitmap and can be tiled, stretched, or aligned.
<clip>ClipDrawableA Drawable that clips another Drawable based on this Drawable’s current level value. You can control how much the child Drawable gets clipped in width and height based on the level, as well as a gravity to control where it is placed in its overall container. Most often used to implement things like progress bars.
<color>ColorDrawableA specialized Drawable that fills the Canvas with a specified color, with respect to the clip region.
<inset>InsetDrawableA Drawable that insets another Drawable by a specified distance. This is used when a View needs a background that is smaller than the View’s actual bounds.
<layer-list>LayerDrawableA Drawable that manages an array of other Drawables. These are drawn in array order.
<level-list>LevelListDrawableA resource that manages a number of alternate Drawables, each assigned a maximum numerical value.
<nine-patch>NinePatchDrawableA resizeable bitmap, with stretchable areas that you define.
<rotate>RotateDrawableA Drawable that can rotate another Drawable based on the current level value. The start and end angles of rotation can be controlled to map any circular arc to the level values range.
<scale>ScaleDrawableA Drawable that changes the size of another Drawable based on its current level value.
<selector>StateListDrawableLets you assign a number of graphic images to a single Drawable and swap out the visible item based on state.
<shape>GradientDrawableBasic method for drawing shapes via XML.
<transition>TransitionDrawableAn extension of <layer-list> that is intended to cross-fade between the first and second layer. The format is exactly the same as <layer-list>.

http://idunnolol.com/android/drawables.html


ColorDrawable

ColorDrawable 實(shí)際上是代表了單色可繪制區(qū)域,它包裝了一種固定的顏色,當(dāng)ColorDrawable被繪制到畫布的時(shí)候會(huì)使用顏色填充Paint,在畫布上繪制一塊單色的區(qū)域。

Xml的方式

android:background=”@drawable/colordrawable_xml”

<TextViewandroid:id="@+id/id_tv_colorDrawableDemo_Xml"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_margin="10dp"android:text="ColorDrawable-ByXml"android:textColor="@color/bg_black"android:background="@drawable/colordrawable_xml"android:textSize="20sp" />

顏色定義在color.xml中,使用時(shí)直接引用即可。

<?xml version="1.0" encoding="utf-8"?> <color xmlns:android="http://schemas.android.com/apk/res/android"android:color="@color/skyblue"/>

JavaCode的方式

代碼中必須要明確指出透明度(Alpha)代表的數(shù)據(jù),即,要加上0x,而且不能把透明度漏掉,否則就是透明的了。

public class ColorDrawableActivity extends AppCompatActivity {private TextView mIdTvColorDrawableDemo;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_color_drawable);mIdTvColorDrawableDemo = (TextView) findViewById(R.id.id_tv_colorDrawableDemo_javaCode);/*** setBackground 在 4.1(API16)之后增加*/if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {/*** 使用Java代碼創(chuàng)建ColorDrawable,* 需要注意的是Android中使用一個(gè)int類型的數(shù)據(jù)表示顏色值,* 通常習(xí)慣使用十六進(jìn)制格式的數(shù)據(jù)表示顏色值。* 一個(gè)int類型包含四個(gè)字節(jié),* 分別代表顏色的4個(gè)組成部分:透明度(Alpha)、紅(RED)、綠(GREEN)、藍(lán)(BLUE),* 每個(gè)部分由一個(gè)字節(jié)(8個(gè)bit)表示,取值范圍為0~255。* 在xml中使用顏色時(shí)可以省略透明度(Alpha)部分,* 如#ff0000表示紅色。* 但是在代碼中必須要明確指出透明度(Alpha)代表的數(shù)據(jù),* 如果省略了就表示完全透明的顏色,也就是說當(dāng)繪制到畫布上時(shí),看不出有任何效果。*/mIdTvColorDrawableDemo.setBackground(new ColorDrawable(0xffff0000));}} }

運(yùn)行圖


GradientDrawable

GradientDrawable 表示一個(gè)漸變區(qū)域,可以實(shí)現(xiàn)線性漸變、發(fā)散漸變和平鋪漸變效果。

在xml文件中使用shape作為根節(jié)點(diǎn)來創(chuàng)建GradientDrawable,很多屬性和子節(jié)點(diǎn)。

shape

Xml的方式

線性漸變linear

<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android"android:shape="oval"><!--一個(gè)具有漸變區(qū)域的Drawable,可以實(shí)現(xiàn)線性漸變,發(fā)散漸變和平鋪漸變效果核心節(jié)點(diǎn):<gradient/>,有如下可選屬性:startColor:漸變的起始顏色centerColor:漸變的中間顏色endColor:漸變的結(jié)束顏色type:漸變類型,可選(linear,radial,sweep), 線性漸變(可設(shè)置漸變角度),發(fā)散漸變(中間向四周發(fā)散),平鋪漸變centerX:漸變中間亞瑟的x坐標(biāo),取值范圍為:0~1centerY:漸變中間顏色的Y坐標(biāo),取值范圍為:0~1angle:只有l(wèi)inear類型的漸變才有效,表示漸變角度,必須為45的倍數(shù)哦gradientRadius:只有radial和sweep類型的漸變才有效,radial必須設(shè)置,表示漸變效果的半徑useLevel:判斷是否根據(jù)level繪制漸變效果--><gradient android:angle="90"android:centerColor="#00ff00"android:endColor="#0000ff"android:startColor="#ff0000" /><!--描邊--><stroke android:width="3dip"android:color="#fff"android:dashGap="5dip"android:dashWidth="4dip" /> </shape>

發(fā)散漸變r(jià)adial

<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android"android:innerRadius="0dp"android:shape="ring"android:thickness="100dp"android:useLevel="false"><gradient android:centerColor="#FFEB82"android:endColor="#35B2DE"android:gradientRadius="50"android:startColor="#DEACAB"android:type="radial"android:useLevel="false" /></shape>

平鋪漸變sweep

<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android"android:innerRadiusRatio="8"android:shape="ring"android:thicknessRatio="3"android:useLevel="false"><gradient android:centerColor="#FFEB82"android:endColor="#35B2DE"android:startColor="#DEACAB"android:type="sweep"android:useLevel="false" /></shape>

引用的Activity

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><TextView android:id="@+id/id_tv_gradientDrawableDemo_Xml1"android:layout_width="200dp"android:layout_height="200dp"android:layout_gravity="center_horizontal"android:layout_margin="10dp"android:background="@drawable/gradient_linear"android:gravity="center"android:text="線性漸變linear-ByXml"android:textColor="@color/bg_black"android:textSize="20sp" /><TextView android:id="@+id/id_tv_gradientDrawableDemo_Xml2"android:layout_width="200dp"android:layout_height="200dp"android:layout_gravity="center_horizontal"android:layout_margin="10dp"android:background="@drawable/gradient_radial"android:gravity="center"android:text="發(fā)散漸變r(jià)adial-ByXml"android:textColor="@color/bg_black"android:textSize="20sp" /><TextView android:id="@+id/id_tv_gradientDrawableDemo_Xml3"android:layout_width="200dp"android:layout_height="200dp"android:layout_gravity="center_horizontal"android:layout_margin="10dp"android:background="@drawable/gradient_sweep"android:gravity="center"android:text="平鋪漸變sweep-ByXml"android:textColor="@color/bg_black"android:textSize="20sp" /></LinearLayout>

運(yùn)行圖


BitmapDrawable

BitmapDrawable 是對(duì)bitmap的一種包裝,可以設(shè)置它包裝的bitmap在BitmapDrawable區(qū)域內(nèi)的繪制方式,如平鋪填充、拉伸填充或者保持圖片原始大小,也可以在BitmapDrawable區(qū)域內(nèi)部使用gravity指定的對(duì)齊方式。

在xml文件中使用bitmap作為根節(jié)點(diǎn)來定義BitmapDrawable。

可選屬性說明:

  • src:圖片資源~ antialias:是否支持抗鋸齒 filter:是否支持位圖過濾,支持的話可以是圖批判顯示時(shí)比較光滑
  • dither:是否對(duì)位圖進(jìn)行抖動(dòng)處理
  • gravity:若位圖比容器小,可以設(shè)置位圖在容器中的相對(duì)位置
  • tileMode:指定圖片平鋪填充容器的模式,設(shè)置這個(gè)的話,gravity屬性會(huì)被忽略,有以下可選值: disabled(整個(gè)圖案拉伸平鋪),clamp(原圖大小), repeat(平鋪),mirror(鏡像平鋪)

Xml的方式

<?xml version="1.0" encoding="utf-8"?> <bitmap xmlns:android="http://schemas.android.com/apk/res/android" android:dither="true" android:src="@drawable/ic_launcher" android:tileMode="mirror" />

JavaCode的方式

import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Shader; import android.graphics.drawable.BitmapDrawable; import android.os.Build; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.widget.ImageView;import com.turing.base.R; import com.turing.base.utils.AlertUtil;public class BitmapDrawableActivity extends AppCompatActivity {private ImageView mIdBitmapDrawableXml;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_bitmap_drawable);mIdBitmapDrawableXml = (ImageView) findViewById(R.id.id_bitmapDrawable_xml);// 通過代碼的方式創(chuàng)建BitmapDrawableBitmap mBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.zjl);BitmapDrawable mBitmapDrawable = new BitmapDrawable(mBitmap);mBitmapDrawable.setTileModeXY(Shader.TileMode.MIRROR, Shader.TileMode.MIRROR);mBitmapDrawable.setAntiAlias(true);mBitmapDrawable.setDither(true);if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {mIdBitmapDrawableXml.setBackground(mBitmapDrawable); // mIdBitmapDrawableXml.setImageDrawable(mBitmapDrawable);} else {AlertUtil.showDialogWithClose(this, "API<16 不支持setBackground屬性設(shè)置");}} }

這種方式基本上很啰嗦,很少會(huì)用到,了解下就好了

運(yùn)行圖


InsetDrawable

表示把一個(gè)Drawable嵌入到另外一個(gè)Drawable的內(nèi)部,并且在內(nèi)部留一些間距, 類似與Drawable的padding屬性,但padding表示的是Drawable的內(nèi)容與Drawable本身的邊距! 而InsetDrawable表示的是兩個(gè)Drawable與容器之間的邊距,*當(dāng)控件需要的背景比實(shí)際的邊框 小的時(shí)候,比較適合使用InsetDrawable*

比如使用這個(gè)可以解決我們自定義Dialog與屏幕之間 的一個(gè)間距問題,相信做過的朋友都知道,即使我們?cè)O(shè)置了layout_margin的話也是沒用的,這個(gè) 時(shí)候就可以用到這個(gè)InsetDrawable了!只需為InsetDrawable設(shè)置一個(gè)insetXxx設(shè)置不同 方向的邊距,然后為設(shè)置為Dialog的背景即可!


相關(guān)屬性如下:

  • drawable:引用的Drawable,如果為空,必須有一個(gè)Drawable類型的子節(jié)點(diǎn)!
  • visible:設(shè)置Drawable是否可見
  • insetLeft,insetRight,insetTop,insetBottm:設(shè)置左右上下的邊距
  • Xml的方式

    <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context="com.turing.base.activity.drawable.InsetDrawableActivity"><ImageView android:id="@+id/mIv"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_centerInParent="true"android:background="@drawable/zjl"android:src="@drawable/insetdrawable_simple" /></RelativeLayout>

    insetdrawable_simple.xml

    <?xml version="1.0" encoding="utf-8"?> <inset xmlns:android="http://schemas.android.com/apk/res/android"android:insetBottom="60dp"android:insetLeft="30dp"android:insetRight="30dp"android:insetTop="60dp"android:visible="true"><!--插入一個(gè)藍(lán)色的矩形作為演示之用--><shape android:shape="rectangle"><solid android:color="#0000ff" /></shape></inset>

    JavaCode的方式

    public class InsetDrawableActivity extends AppCompatActivity {private ImageView mMIv;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_inset_drawable);mMIv = (ImageView) findViewById(R.id.mIv);// JavaCodeInsetDrawable insetDrawable = new InsetDrawable(getResources().getDrawable(R.drawable.zjl), 30, 60, 30, 60);// 設(shè)置mMIv.setImageDrawable(insetDrawable);} }


    NinePathDrawable

    如何制作.9圖片

    在AS中使用.9圖需要注意:

    • .9圖片必須放在drawable目錄下,不能存放在mipmap下
    • AS中的.9圖,必須要有黑線,不然編譯都不會(huì)通過

    使用“點(diǎn)九”圖片處理技術(shù),可以將圖片橫向和縱向同時(shí)進(jìn)行拉伸,以實(shí)現(xiàn)在多分辨率下的完美顯示效果。點(diǎn)九圖片在拉伸時(shí)仍能保留圖像的漸變質(zhì)感和圓角的精細(xì)度。

    Android SDK工具集提供了處理點(diǎn)九圖片的工具,可以通過draw9patch.bat運(yùn)行,通過這個(gè)工具可以很容易把普通的PNG圖片處理成“點(diǎn)九”圖片。

    從它的名字也很容易理解“點(diǎn)九”圖的含義,其實(shí)相當(dāng)于把一張PNG圖分成了9個(gè)部分(九宮格),分別為4個(gè)角,4條邊,以及一個(gè)中間區(qū)域,4個(gè)角是不做拉伸的,所以還能一直保持圓角的清晰狀態(tài),而2條水平邊和2條垂直邊分別只做水平和垂直拉伸,所以不會(huì)出現(xiàn)邊框被拉粗的情況,只有中間用黑線指定的區(qū)域做拉伸,通過這種處理方式圖片才不會(huì)失真。如圖6-5所示,對(duì)4條黑線分別做了注釋。左邊和上邊的黑線形成的矩形區(qū)域是圖片的拉伸區(qū)域,下邊和右邊形成的矩形區(qū)域是內(nèi)容所在的區(qū)域。黑線可以是連續(xù)的也可以是不連續(xù)的,不過為了達(dá)到最好的顯示效果,最好使用連續(xù)的黑線。

    使用了*.9.png圖片技術(shù)后,只需要采用一套界面切圖去適配不同的分辨率,而且大幅減少安裝包的大小。

    要點(diǎn): 左上拉伸 右下內(nèi)容

    在xml文件中使用使用nine-patch作為根節(jié)點(diǎn)創(chuàng)建NinePatchDrawable。同時(shí),也可以使用bitmap包裝點(diǎn)九圖片,android FrameWork會(huì)根據(jù)android:src屬性設(shè)置的圖片類型來生成對(duì)應(yīng)的drawable。

    不過這樣使用基本也是太啰嗦了,直接設(shè)置背景圖就可以了,這里只是說明下可以這樣使用~

    xml定義NinePatchDrawable:

    <!--pic9.xml--> <!--參數(shù)依次為:引用的.9圖片,是否對(duì)位圖進(jìn)行抖動(dòng)處理--> <?xml version="1.0" encoding="utf-8"?> <nine-patch xmlns:android="http://schemas.android.com/apk/res/android" android:src="@drawable/dule_pic" android:dither="true"/>

    使用Bitmap包裝.9圖片:

    <?xml version="1.0" encoding="utf-8"?> <bitmap xmlns:android="http://schemas.android.com/apk/res/android" android:src="@drawable/dule_pic" android:dither="true"/>

    最后,需要指出的是,Android雖然可以使用Java代碼創(chuàng)建NinePatchDrawable,但是極少情況會(huì)那么做,主要的原因是由于Android SDK會(huì)在編譯工程時(shí)對(duì)點(diǎn)九圖片進(jìn)行編譯,形成特殊格式的圖片。使用代碼創(chuàng)建NinePatchDrawable時(shí)只能針對(duì)編譯過的點(diǎn)九圖片資源,對(duì)于沒有編譯過的點(diǎn)九圖片資源都當(dāng)做BitmapDrawable對(duì)待。在使用點(diǎn)九圖片時(shí)需要注意的是,點(diǎn)九圖只能適用于拉伸的情況,對(duì)于壓縮的情況并不適用,如果需要適配很多分辨率的屏幕時(shí)需要把點(diǎn)九圖做的小一點(diǎn)。


    ClipDrawable

    ClipDrawable 是對(duì)一個(gè)Drawable進(jìn)行剪切操作,可以控制這個(gè)drawable的剪切區(qū)域,以及相相對(duì)于容器的對(duì)齊方式,android中的進(jìn)度條就是使用一個(gè)ClipDrawable實(shí)現(xiàn)效果的,它根據(jù)level的屬性值,決定剪切區(qū)域的大小。

    在xml文件中使用clip作為根節(jié)點(diǎn)定義ClipDrawable。

    需要注意的是ClipDrawable是根據(jù)level的大小控制圖片剪切操作的,官方文檔的note中提到:The drawable is clipped completely and not visible when the level is 0 and fully revealed when the level is 10,000。也就是level的大小從0到10000,level為0時(shí)完全不顯示,為10000時(shí)完全顯示。是用Drawable提供的setLevel(int level)方法來設(shè)置剪切區(qū)域。

    • clipOrietntion:設(shè)置剪切的方向,可以設(shè)置水平和豎直2個(gè)方向
    • gravity:從那個(gè)位置開始裁剪
    • drawable:引用的drawable資源,為空的話需要有一個(gè)Drawable類型的子節(jié)點(diǎn) .
      如果沒有android:drawable屬性,必須要設(shè)置一個(gè)任意類型的drawable作為子節(jié)點(diǎn)
    <?xml version="1.0" encoding="utf-8"?> <clip xmlns:android="http://schemas.android.com/apk/res/android"android:clipOrientation="horizontal"android:gravity="left"><bitmap android:src="@drawable/android_text"android:gravity="center"/> </clip>

    核心:通過代碼修改ClipDrawable的level的值!Level的值是0~10000!

    Code

    在主布局文件中設(shè)置一個(gè)ImageView,將src設(shè)置為clipDrawable! 記住是src,如果你寫成了blackground的話會(huì)報(bào)空指針

    activity_clip_drawable_actvity.xml

    <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"><ImageView android:id="@+id/id_iv_clipdrawable"android:layout_width="match_parent"android:layout_height="match_parent"android:src="@drawable/clipdrawable_xml"/></LinearLayout>

    clipdrawable_xml.xml

    <?xml version="1.0" encoding="utf-8"?> <clip xmlns:android="http://schemas.android.com/apk/res/android"android:clipOrientation="horizontal"android:drawable="@drawable/zjl"android:gravity="left"/>

    第一種方式 推薦

    public class ClipDrawableActvity extends AppCompatActivity {private ImageView mIdIvClipdrawable;private ClipDrawable clipDrawable;private Handler handler = new Handler() {@Overridepublic void handleMessage(Message msg) {super.handleMessage(msg);if (msg.what == 0x110) {// level 增加clipDrawable.setLevel(clipDrawable.getLevel() + 500);Message message = Message.obtain();message.what = 0x110;handler.sendMessageDelayed(message, 500);if (clipDrawable.getLevel() > 10000) {handler.removeMessages(0x110);}}}};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_clip_drawable_actvity);mIdIvClipdrawable = (ImageView) findViewById(R.id.id_iv_clipdrawable);clipDrawable = (ClipDrawable) mIdIvClipdrawable.getDrawable();handler.sendEmptyMessage(0x110);}}

    第二種方式:

    public class ClipDrawableActvity extends AppCompatActivity {private ImageView mIdIvClipdrawable;private ClipDrawable clipDrawable;private Handler handler = new Handler() {@Overridepublic void handleMessage(Message msg) {super.handleMessage(msg);if (msg.what == 0x110) {// level 增加clipDrawable.setLevel(clipDrawable.getLevel() + 500);}}};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_clip_drawable_actvity);mIdIvClipdrawable = (ImageView) findViewById(R.id.id_iv_clipdrawable);clipDrawable = (ClipDrawable) mIdIvClipdrawable.getDrawable();// 開啟定時(shí)任務(wù)final Timer timer = new Timer();timer.schedule(new TimerTask() {@Overridepublic void run() {handler.sendEmptyMessage(0x110);// 到達(dá)最大值后,取消任務(wù)if (clipDrawable.getLevel() > 10000) {timer.cancel();}}}, 0, 500);}}

    運(yùn)行圖


    ScaleDrawable

    ScaleDrawable是對(duì)一個(gè)Drawable進(jìn)行縮放操作,可以根據(jù)level屬性控制這個(gè)drawable的縮放比率,也可以設(shè)置它在容器中的對(duì)齊方式。

    在xml文件中使用scale作為根節(jié)點(diǎn)來創(chuàng)建RotateDrawable。

    • android:drawable 指定drawable資源,如果不設(shè)置該屬性,也可以定義drawable類型的子標(biāo)簽

    • android:scaleHeight 設(shè)置可縮放的高度,用百分比表示,格式為XX%,
      0%表示不做任何縮放,50%表示只能縮放一半

    • android:scaleWidth 設(shè)置可縮放的寬度,用百分比表示,格式為XX%,
      0%表示不做任何縮放,50%表示只能縮放一半

    • android:scaleGravity 設(shè)置drawable縮放后的位置,取值和bitmap標(biāo)簽的一樣,默認(rèn)值是left

    http://stackoverflow.com/questions/5507539/android-scaledrawable-doesnt-seems-to-work

    首先聲明一下,通過xml的方式 無效了。。。。。。

    Code

    <ImageView android:id="@+id/id_show_scaleDrawable"android:layout_width="match_parent"android:layout_height="match_parent"android:src="@drawable/scaledrawable_simple"/>

    scaledrawable_simple.xml

    <?xml version="1.0" encoding="utf-8"?> <scale xmlns:android="http://schemas.android.com/apk/res/android"android:drawable="@drawable/face"android:scaleGravity="center"android:scaleHeight="100%"android:scaleWidth="100%" />

    sorry,這樣行不通了。 我們用代碼的方式來創(chuàng)建吧

    public class ScaleDrawableActivity extends AppCompatActivity {private ImageView mIdShowScaleDrawable;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_scale_drawable);mIdShowScaleDrawable = (ImageView) findViewById(R.id.id_show_scaleDrawable);Resources res = getResources();BitmapDrawable bd = (BitmapDrawable) res.getDrawable(R.drawable.zjl);Bitmap b = Bitmap.createScaledBitmap(bd.getBitmap(),(int) (bd.getIntrinsicHeight() * 0.7),(int) (bd.getIntrinsicWidth() * 0.7),false);mIdShowScaleDrawable.setImageBitmap(b);} } <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context="com.turing.base.activity.drawable.ScaleDrawableActivity"><ImageView android:id="@+id/id_show_scaleDrawable"android:layout_width="wrap_content"android:layout_height="wrap_content"/> </RelativeLayout>


    RotateDrawable

    RotateDrawable 是對(duì)一個(gè)Drawable進(jìn)行旋轉(zhuǎn)操作,可以根據(jù)level屬性控制這個(gè)drawable旋轉(zhuǎn)角度,也可以設(shè)置相對(duì)于它所在容器的對(duì)齊方式。

    用來對(duì)Drawable進(jìn)行旋轉(zhuǎn),也是通過setLevel來控制旋轉(zhuǎn)的,最大值也是:10000

    在xml文件中使用rotate作為根節(jié)點(diǎn)來定義RotateDrawable.

    • fromDegrees:起始的角度,,對(duì)應(yīng)最低的level值,默認(rèn)為0
    • toDegrees:結(jié)束角度,對(duì)應(yīng)最高的level值,默認(rèn)360
    • pivotX:設(shè)置參照點(diǎn)的x坐標(biāo),取值為0~1,默認(rèn)是50%,即0.5
    • pivotY:設(shè)置參照點(diǎn)的Y坐標(biāo),取值為0~1,默認(rèn)是50%,即0.5 ps:如果出現(xiàn)旋轉(zhuǎn)圖片顯示不完全的話可以修改上述兩個(gè)值解決!
    • drawable:設(shè)置位圖資源
    • visible:設(shè)置drawable是否可見!

    Code

    <?xml version="1.0" encoding="utf-8"?> <rotate xmlns:android="http://schemas.android.com/apk/res/android"android:drawable="@drawable/zjl"android:pivotX="50%"android:pivotY="50%"android:fromDegrees="180"/>


    AnimationDrawbale

    詳見本人另外博客
    AnimationDrawable類:幀動(dòng)畫類

    AnimationDrawable 對(duì)應(yīng)于Android中的幀動(dòng)畫,就是把一系列的drawable按照一定的順序,一幀一幀的播放,并且可以使用android:oneshot屬性設(shè)置是否循環(huán)播放。

    在xml文件中使用animation-list作為根節(jié)點(diǎn)定義AnimationDrawable,使用item設(shè)置需要播放的每一幀使用的drawable資源,以及每一幀持續(xù)的時(shí)常。


    <?xml version="1.0" encoding="utf-8"?><!--根標(biāo)簽為animation-list,其中oneshot代表著是否只展示一遍,設(shè)置為false會(huì)不停的循環(huán)播放動(dòng)畫根標(biāo)簽下,通過item標(biāo)簽對(duì)動(dòng)畫中的每一個(gè)圖片進(jìn)行聲明android:duration 表示展示所用的該圖片的時(shí)間長度--> <animation-list xmlns:android="http://schemas.android.com/apk/res/android"android:oneshot="true"><item android:drawable="@drawable/horse1"android:duration="100" /><item android:drawable="@drawable/horse2"android:duration="100" /><item android:drawable="@drawable/horse3"android:duration="100" /><item android:drawable="@drawable/horse4"android:duration="100" /><item android:drawable="@drawable/horse5"android:duration="100" /><item android:drawable="@drawable/horse6"android:duration="100" /><item android:drawable="@drawable/horse7"android:duration="100" /><item android:drawable="@drawable/horse8"android:duration="100" /> </animation-list>

    定義了AnimationDrawable之后需要主動(dòng)調(diào)用AnimationDrawable的start播放動(dòng)畫,需要注意的是,當(dāng)我們?cè)贏ctivity的oncreate方法中調(diào)用start方法時(shí)會(huì)沒有任何效果,那是因?yàn)関iew還沒有初始化完成,無法播放動(dòng)畫,所以需要使用handler來延遲播放動(dòng)畫,具體實(shí)現(xiàn)代碼如下:

    mHandler.postDelayed(new Runnable() {@Overridepublic void run() {((AnimationDrawable)mDrawable).start();} }, 1000);


    LayerDrawable

    LayerDrawable 管理一組drawable,每個(gè)drawable都處于不同的層,當(dāng)它們被繪制的時(shí)候,按照順序全部都繪制到畫布上。雖然這些drawable會(huì)有交差或者重疊的區(qū)域,但是它們是位于不同的層,彼此之間不會(huì)影響。

    在xml文件中使用layer-list作為根節(jié)點(diǎn)來定義LayerDrawable,通過item子節(jié)點(diǎn)定義每一層的drawable,layer-list沒有屬性節(jié)點(diǎn),只包含item子節(jié)點(diǎn)。


    • drawable:引用的位圖資源,如果為空徐璈有一個(gè)Drawable類型的子節(jié)點(diǎn)
    • left:層相對(duì)于容器的左邊距
    • right:層相對(duì)于容器的右邊距
    • top:層相對(duì)于容器的上邊距
    • bottom:層相對(duì)于容器的下邊距
    • id:層的id

    Code

    下面我們通過一個(gè)自定義的Seekbar來演示下如何使用:

    <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:paddingBottom="@dimen/activity_vertical_margin"android:paddingLeft="@dimen/activity_horizontal_margin"android:paddingRight="@dimen/activity_horizontal_margin"android:paddingTop="@dimen/activity_vertical_margin"tools:context="com.turing.base.activity.drawable.LayerDrawableActivity"><SeekBar android:layout_width="match_parent"android:layout_height="wrap_content"android:indeterminateDrawable="@android:drawable/progress_indeterminate_horizontal"android:indeterminateOnly="false"android:maxHeight="10dp"android:minHeight="5dp"android:progressDrawable="@drawable/layerxml"android:thumb="@drawable/shape_slider"/></RelativeLayout>

    layerxml.xml

    <?xml version="1.0" encoding="utf-8"?> <layer-list xmlns:android="http://schemas.android.com/apk/res/android"><item><shape android:shape="rectangle"><corners android:radius="50dp" /><solid android:color="#C2C2C1" /></shape></item><item><clip><shape><corners android:radius="50dp" /><solid android:color="#BCDA73" /></shape></clip></item></layer-list>

    shape_slider.xml

    <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android"android:shape="oval"><solid android:color="#2C96ED"/><size android:height="30dp" android:width="30dp"/> </shape>

    主Activity

    public class LayerDrawableActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_layer_drawable);} }

    運(yùn)行圖


    LevelListDrawable

    管理一組drawable,每一個(gè)drawable都對(duì)應(yīng)一個(gè)level范圍,當(dāng)它們被繪制的時(shí)候,根據(jù)level屬性值選取對(duì)應(yīng)的一個(gè)drawable繪制到畫布上。

    在xml文件中使用level-list作為根節(jié)點(diǎn)來定義LevelListDrawable,通過item子節(jié)點(diǎn)定義每一層的drawable,level-list沒有屬性節(jié)點(diǎn),只包含item子節(jié)點(diǎn)。


    item可供設(shè)置的屬性如下:

    • drawable:引用的位圖資源,如果為空需要有一個(gè)Drawable類型的子節(jié)點(diǎn)
    • minlevel:level對(duì)應(yīng)的最小值
    • maxlevel:level對(duì)應(yīng)的最大值

    通過shapeDrawable畫圓,一式五份,改下寬高即可:

    <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android"android:shape="oval"><solid android:color="#2C96ED"/><size android:height="20dp" android:width="20dp"/> </shape>

    接著到LevelListDrawable,這里我們?cè)O(shè)置五層:

    <?xml version="1.0" encoding="utf-8"?> <level-list xmlns:android="http://schemas.android.com/apk/res/android"><item android:drawable="@drawable/shape_circle1" android:maxLevel="2000"/><item android:drawable="@drawable/shape_circle2" android:maxLevel="4000"/><item android:drawable="@drawable/shape_circle3" android:maxLevel="6000"/><item android:drawable="@drawable/shape_circle4" android:maxLevel="8000"/><item android:drawable="@drawable/shape_circle5" android:maxLevel="10000"/></level-list>

    引用

    android:src 一定要是src ,不能使background,否則會(huì)拋出空指針異常。

    <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"><ImageView android:id="@+id/id_iv_levellist"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerInParent="true"android:src="@drawable/levellist" /> </RelativeLayout> import android.graphics.drawable.LevelListDrawable; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.support.v7.app.AppCompatActivity; import android.widget.ImageView;import com.turing.base.R;public class LevelListDrawableActivity extends AppCompatActivity {private ImageView imageView;private LevelListDrawable levelListDrawable;private Handler handler = new Handler() {@Overridepublic void handleMessage(Message msg) {switch (msg.what) {case 0x110:if (levelListDrawable.getLevel() > 10000) {// 設(shè)置為0 ,循環(huán)展示levelListDrawable.setLevel(0);imageView.setImageLevel(0);//移除消息// handler.removeMessages(0x110);}imageView.setImageLevel(levelListDrawable.getLevel() + 2000);Message message = Message.obtain();message.what = 0x110;handler.sendMessageDelayed(message, 500);break;default:break;}}};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_level_list_drawable);imageView = (ImageView) findViewById(R.id.id_iv_levellist);levelListDrawable = (LevelListDrawable) imageView.getDrawable();imageView.setImageLevel(0);handler.sendEmptyMessage(0x110);} }


    StateListDrawable

    StateListDrawable管理一組drawable,每一個(gè)drawable都對(duì)應(yīng)著一組狀態(tài),狀態(tài)的選擇類似于java中的switch-case組合,按照順序比較狀態(tài),當(dāng)遇到匹配的狀態(tài)后,就返回對(duì)應(yīng)的drawable,因此需要把最精確的匹配放置在最前面,按照從精確到粗略的順序排列。

    StateListDrawable在Android中使用的非常廣泛,所有控件的背景基本上都使用了StateListDrawable,比如按鈕就具有很多狀態(tài),按下狀態(tài)、選中狀態(tài)、默認(rèn)狀態(tài)、禁用狀態(tài)等等,像這樣在不用的狀態(tài)下顯示效果不一樣的時(shí)候,就是需要使用StateListDrawable的時(shí)候。

    在xml文件中使用selector作為根節(jié)點(diǎn)來定義StateListDrawable,并使用item定義不同狀態(tài)下的drawable。


    <?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"><!-- 當(dāng)前窗口失去焦點(diǎn)時(shí) --><item android:drawable="@drawable/bg_btn_lost_window_focused" android:state_window_focused="false" /><!-- 不可用時(shí) --><item android:drawable="@drawable/bg_btn_disable" android:state_enabled="false" /><!-- 按壓時(shí) --><item android:drawable="@drawable/bg_btn_pressed" android:state_pressed="true" /><!-- 被選中時(shí) --><item android:drawable="@drawable/bg_btn_selected" android:state_selected="true" /><!-- 被激活時(shí) --><item android:drawable="@drawable/bg_btn_activated" android:state_activated="true" /><!-- 默認(rèn)時(shí) --><item android:drawable="@drawable/bg_btn_normal" /></selector>


    TransitionDrawable

    TransitionDrawable 是LayerDrawable的子類,不過它只負(fù)責(zé)管理兩層drawable,并且提供了一個(gè)透明度變化的動(dòng)畫,可以控制從一層drawable過度到另外一層drawable的動(dòng)畫效果。

    在xml文件中使用transition作為根節(jié)點(diǎn)來定義TransitionDrawable,通過item子節(jié)點(diǎn)定義兩層使用的drawable

    優(yōu)秀的文章1

    優(yōu)秀的文章2

    總結(jié)

    以上是生活随笔為你收集整理的Android各种各样的Drawable-更新中的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。