Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android基礎入門教程——8.1.2 Android中的13種Drawable小結 Part 2

Android基礎入門教程——8.1.2 Android中的13種Drawable小結 Part 2

編輯:關於Android編程

 

 本節引言:

本節我們繼續來學習Android中的Drawable資源,上一節我們學習了:
ColorDrawableNinePatchDrawable
ShapeDrawableGradientDrawable!這四個Drawable~
而本節我們繼續來學習接下來的五個Drawable,他們分別是:
BitmapDrawableInsertDrawableClipDrawable
RotateDrawableAnimationDrawable!
還是貼下13種Drawable的導圖:

此處輸入鏈接的描述

好的,開始本節內容~<喎?/kf/ware/vc/" target="_blank" class="keylink">vcD4NCjwvYmxvY2txdW90ZT4NCjxociAvPg0KPGgyIGlkPQ=="1bitmapdrawable">1.BitmapDrawable

對Bitmap的一種封裝,可以設置它包裝的bitmap在BitmapDrawable區域中的繪制方式,有:
平鋪填充,拉伸填或保持圖片原始大小!以<bitmap>為根節點!
可選屬性如下:

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

對應的效果圖:

title=

①XML定義BitmapDrawable:

  
  

②實現相同效果的Java代碼:

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

2.InsetDrawable

表示把一個Drawable嵌入到另外一個Drawable的內部,並且在內部留一些間距,
類似與Drawable的padding屬性,但padding表示的是Drawable的內容與Drawable本身的邊距!
InsetDrawable表示的是兩個Drawable與容器之間的邊距,當控件需要的**背景比實際的邊框
小的時候**,比較適合使用InsetDrawable,比如使用這個可以解決我們自定義Dialog與屏幕之間
的一個間距問題,相信做過的朋友都知道,即使我們設置了layout_margin的話也是沒用的,這個
時候就可以用到這個InsetDrawable了!只需為InsetDrawable設置一個insetXxx設置不同
方向的邊距,然後為設置為Dialog的背景即可!

相關屬性如下:

1.drawable:引用的Drawable,如果為空,必須有一個Drawable類型的子節點! 2.visible:設置Drawable是否額空間 3.insetLeft,insetRight,insetTop,insetBottm:設置左右上下的邊距

①XML中使用:

  
  

在Java代碼中使用

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

使用效果圖

title=


3.ClipDrawable

Clip可以譯為剪的意思,我們可以把ClipDrawable理解為從位圖上剪下一個部分;
Android中的進度條就是使用ClipDrawable來實現的,他根據設置level的值來決定剪切
區域的大小,根節點是<clip>

相關屬性如下

clipOrietntion:設置剪切的方向,可以設置水平和豎直2個方向 gravity:從那個位置開始裁剪 drawable:引用的drawable資源,為空的話需要有一個Drawable類型的子節點
ps:這個Drawable類型的子節點:就是在

 

②在activity_main主布局文件中設置一個ImageView,將src設置為clipDrawable!
記住是src哦,如果你寫成了blackground的話可是會報空指針的哦!!!!



    

  

③MainActivity.java通過setLevel設置截取區域大小:

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);
        // 核心實現代碼
        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);
    }
}

好的,有點意思,妹子圖別問我拿,百度上一堆哈~title=


4.RotateDrawable

用來對Drawable進行旋轉,也是通過setLevel來控制旋轉的,最大值也是:10000

相關屬性如下

fromDegrees:起始的角度,,對應最低的level值,默認為0 toDegrees:結束角度,對應最高的level值,默認360 pivotX:設置參照點的x坐標,取值為0~1,默認是50%,即0.5 pivotY:設置參照點的Y坐標,取值為0~1,默認是50%,即0.5
ps:如果出現旋轉圖片顯示不完全的話可以修改上述兩個值解決! drawable:設置位圖資源 visible:設置drawable是否可見!

角度圖如下

title=

使用示例

運行效果圖

title=

代碼實現

在第三點的clipDrawable上做一點點修改即可!

①定義一個rotateDrawable資源文件:


  

②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, 轉完了~,
                            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);
        // 核心實現代碼
        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

本節最後一個Drawable,AnimationDrawable是用來實現Android中幀動畫的,就是把一系列的
Drawable,按照一定得順序一幀幀地播放;Android中動畫比較豐富,有傳統補間動畫,平移,
縮放等等效果,但是這裡我們僅僅介紹這個AnimationDrawable實現幀動畫,關於alpha,scale,
translate,rotate等,後續在動畫章節再進行詳細的介紹~
我們這裡使用<animation-list>作為根節點

相關屬性方法:

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

使用示例

運行效果圖

title=

代碼實現

先定義一個AnimationDrawable的xml資源文件:




    

    
    
    
    
    

  

②activity_main.xml設置下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);
        // 核心實現代碼
        ad = (AnimationDrawable) img_show.getDrawable();
        Handler handler = new Handler();
        handler.postDelayed(new Runnable() {
            @Override
            public void run() {
                ad.start();
            }
        }, 300);
    }
}

嘿嘿,超簡單有木有,以後在一些需要用到幀動畫的地方,直接上AnimationDrawable
當然,只適合於不需要進行控制的幀動畫,比如上面這個就是超表下拉刷新時候的進度條素材
做成的一個簡單幀動畫!根據自己的需求自行拓展~


 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved