Android Android中的13種Drawable小結(jié) Part 2

2023-03-31 14:17 更新

本節(jié)引言:

本節(jié)我們繼續(xù)來學(xué)習(xí)Android中的Drawable資源,上一節(jié)我們學(xué)習(xí)了:
ColorDrawable;
NinePatchDrawable;
ShapeDrawable;
GradientDrawable
這四個(gè)Drawable~ 而本節(jié)我們繼續(xù)來學(xué)習(xí)接下來的五個(gè)Drawable,他們分別是:
BitmapDrawable;
InsertDrawable;
ClipDrawable;
RotateDrawable;
AnimationDrawable!
還是貼下13種Drawable的導(dǎo)圖:

好的,開始本節(jié)內(nèi)容~


1.BitmapDrawable

對(duì)Bitmap的一種封裝,可以設(shè)置它包裝的bitmap在BitmapDrawable區(qū)域中的繪制方式,有: 平鋪填充,拉伸填或保持圖片原始大小!以為根節(jié)點(diǎn)! 可選屬性如下:

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

對(duì)應(yīng)的效果圖:

①XML定義BitmapDrawable:

<?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" />

②實(shí)現(xiàn)相同效果的Java代碼:

BitmapDrawable bitDrawable = new BitmapDrawable(bitmap);  
bitDrawable.setDither(true);  
bitDrawable.setTileModeXY(TileMode.MIRROR,TileMode.MIRROR);  

2.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è)間距問題,相信做過的朋友都知道,即使我們設(shè)置了layout_margin的話也是沒用的,這個(gè) 時(shí)候就可以用到這個(gè)InsetDrawable了!只需為InsetDrawable設(shè)置一個(gè)insetXxx設(shè)置不同 方向的邊距,然后為設(shè)置為Dialog的背景即可!

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

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

①XML中使用:

<?xml version="1.0" encoding="utf-8"?>  
<inset xmlns:android="http://schemas.android.com/apk/res/android"  
    android:drawable="@drawable/test1"  
    android:insetBottom="10dp"  
    android:insetLeft="10dp"  
    android:insetRight="10dp"  
    android:insetTop="10dp" /> 

在Java代碼中使用

InsetDrawable insetDrawable = new InsetDrawable(getResources()  
        .getDrawable(R.drawable.test1), 10, 10, 10, 10); 

使用效果圖


3.ClipDrawable

Clip可以譯為剪的意思,我們可以把ClipDrawable理解為從位圖上剪下一個(gè)部分; Android中的進(jìn)度條就是使用ClipDrawable來實(shí)現(xiàn)的,他根據(jù)設(shè)置level的值來決定剪切 區(qū)域的大小,根節(jié)點(diǎn)是

相關(guān)屬性如下

  • clipOrietntion:設(shè)置剪切的方向,可以設(shè)置水平和豎直2個(gè)方向
  • gravity:從那個(gè)位置開始裁剪
  • drawable:引用的drawable資源,為空的話需要有一個(gè)Drawable類型的子節(jié)點(diǎn) ps:這個(gè)Drawable類型的子節(jié)點(diǎn):就是在加上這樣的語句: 這樣...

使用示例

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

運(yùn)行效果圖

代碼實(shí)現(xiàn)

①定義一個(gè)ClipDrawable的資源xml:

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

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

<LinearLayout 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:orientation="vertical">

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

</LinearLayout>  

③MainActivity.java通過setLevel設(shè)置截取區(qū)域大小:

public class MainActivity extends AppCompatActivity {

    private ImageView img_show;
    private ClipDrawable cd;
    private Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            if (msg.what == 0x123) {
                cd.setLevel(cd.getLevel() + 500);
            }
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        img_show = (ImageView) findViewById(R.id.img_show);
        // 核心實(shí)現(xiàn)代碼
        cd = (ClipDrawable) img_show.getDrawable();
        final Timer timer = new Timer();
        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                handler.sendEmptyMessage(0x123);
                if (cd.getLevel() >= 10000) {
                    timer.cancel();
                }
            }
        }, 0, 300);
    }
}

好的,有點(diǎn)意思,妹子圖別問我拿,百度上一堆哈~


4.RotateDrawable

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

相關(guān)屬性如下

  • 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是否可見!

角度圖如下

使用示例

運(yùn)行效果圖

代碼實(shí)現(xiàn)

在第三點(diǎn)的clipDrawable上做一點(diǎn)點(diǎn)修改即可!

①定義一個(gè)rotateDrawable資源文件:

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

②activity_main.xml中修改下src指向上述drawable即可,MainActivity只需要把ClipDrawable 改成rotateDrawable即可!

public class MainActivity extends AppCompatActivity {

    private ImageView img_show;
    private RotateDrawable cd;
    private Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            if (msg.what == 0x123) {
                if (cd.getLevel() >= 10000)
                    Toast.makeText(MainActivity.this, "轉(zhuǎn)完了~",
                            Toast.LENGTH_LONG).show();
                cd.setLevel(cd.getLevel() + 400);
            }
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        img_show = (ImageView) findViewById(R.id.img_show);
        // 核心實(shí)現(xiàn)代碼
        cd = (RotateDrawable) img_show.getDrawable();
        final Timer timer = new Timer();
        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                handler.sendEmptyMessage(0x123);
                if (cd.getLevel() >= 10000) {
                    timer.cancel();
                }
            }
        }, 0, 100);
    }
}

5.AnimationDrawable

本節(jié)最后一個(gè)Drawable,AnimationDrawable是用來實(shí)現(xiàn)Android中幀動(dòng)畫的,就是把一系列的 Drawable,按照一定得順序一幀幀地播放;Android中動(dòng)畫比較豐富,有傳統(tǒng)補(bǔ)間動(dòng)畫,平移, 縮放等等效果,但是這里我們僅僅介紹這個(gè)AnimationDrawable實(shí)現(xiàn)幀動(dòng)畫,關(guān)于alpha,scale, translate,rotate等,后續(xù)在動(dòng)畫章節(jié)再進(jìn)行詳細(xì)的介紹~

我們這里使用作為根節(jié)點(diǎn)

相關(guān)屬性方法:

oneshot:設(shè)置是否循環(huán)播放,false為循環(huán)播放!!! duration:幀間隔時(shí)間,通常我們會(huì)設(shè)置為300毫秒 我們獲得AniamtionDrawable實(shí)例后,需要調(diào)用它的start()方法播放動(dòng)畫,另外要注意 在OnCreate()方法中調(diào)用的話,是沒有任何效果的,因?yàn)閂iew還沒完成初始化,我們可以 用簡單的handler來延遲播放動(dòng)畫!當(dāng)然還有其他的方法,可見下述鏈接: Android AnimationDrawable運(yùn)行的幾種方式 使用AnimationDrawable來實(shí)現(xiàn)幀動(dòng)畫真的是非常方便的~

使用示例

運(yùn)行效果圖

代碼實(shí)現(xiàn)

先定義一個(gè)AnimationDrawable的xml資源文件:

<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
    android:oneshot="false">

    <item
        android:drawable="@mipmap/ic_pull_to_refresh_loading01"
        android:duration="100" />

    <item
        android:drawable="@mipmap/ic_pull_to_refresh_loading02"
        android:duration="100" />
    <item
        android:drawable="@mipmap/ic_pull_to_refresh_loading03"
        android:duration="100" />
    <item
        android:drawable="@mipmap/ic_pull_to_refresh_loading04"
        android:duration="100" />
    <item
        android:drawable="@mipmap/ic_pull_to_refresh_loading05"
        android:duration="100" />
    <item
        android:drawable="@mipmap/ic_pull_to_refresh_loading06"
        android:duration="100" />

</animation-list> 

②activity_main.xml設(shè)置下src,然后MainActivity中:

public class MainActivity extends AppCompatActivity {

    private ImageView img_show;
    private AnimationDrawable ad;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        img_show = (ImageView) findViewById(R.id.img_show);
        // 核心實(shí)現(xiàn)代碼
        ad = (AnimationDrawable) img_show.getDrawable();
        Handler handler = new Handler();
        handler.postDelayed(new Runnable() {
            @Override
            public void run() {
                ad.start();
            }
        }, 300);
    }
}

嘿嘿,超簡單有木有,以后在一些需要用到幀動(dòng)畫的地方,直接上AnimationDrawable, 當(dāng)然,只適合于不需要進(jìn)行控制的幀動(dòng)畫,比如上面這個(gè)就是超表下拉刷新時(shí)候的進(jìn)度條素材 做成的一個(gè)簡單幀動(dòng)畫!根據(jù)自己的需求自行拓展~


本節(jié)小結(jié):

 本節(jié)又介紹了另外的五個(gè)Drawable,很有趣是吧,還不快快將他們應(yīng)用到你的實(shí)際開發(fā)當(dāng)中~ 嘻嘻,就說這么多,謝謝!另外剛剛有讀者私信我說以前的文章別刪行不行,嗯,這里說下 只刪除一些重復(fù)的,比如和這個(gè)雷同的那幾節(jié)~當(dāng)然我也會(huì)備份!刪除的文章都會(huì)備份的~ 所以放心!

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)