Drawable類及XMLDrawable的使用


一.性質

可直接使用.png、.jpg、.gif、9.png等圖片作為資源,也可使用多種XML文件作為資源。(就是這些資源都能生成Drawable對象)。並對XML文件作出相關處理

二.XMLDrawable

1.StateListDrawable

作用:StateListDrawable對象所顯示的Drawable對象會隨着目標組件狀態的改變而改變

組成:

根元素<selector/>,子元素<item/>

子元素<item/>的屬性:android:color或android:drawable

                                android:state_xxx:狀態

舉例:

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="false"
          android:drawable="@mipmap/start"/>
    <item android:state_pressed="true"
          android:drawable="@mipmap/start_down"/>
</selector>

相關目標組件的狀態不列出來

2.LayerDrawable

作用:可包含一個Drawable數組,系統會按照Drawable對象的數組順序繪制,索引越大越被繪制在上層

根元素:<layer-list>  子元素:<item/>

子元素的屬性:android:drawable 作為LayerDrawable的Drawable對象

                    android:id 為Drawable對象指定標識符

                    android:buttom|top...等 指定Drawable的繪制位置

實例1:

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <!--調用android自帶的id修改,利用@android:id 修改父style的background-->
    <item android:drawable="@mipmap/p_1"
          android:id="@android:id/background"/>
    <item android:drawable="@mipmap/p_2"
          android:id="@android:id/progress"/>
</layer-list>

實例2:

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <!--可以在item里面創建各種各樣的XMLDrawable-->
    <item>
        <bitmap android:src="@mipmap/p_3"
                android:gravity="center"/>
    </item>
    <item>
        <bitmap android:src="@mipmap/p_4"
                android:gravity="center"/>
    </item>
</layer-list>

3.ShapeDrawable

作用:設置一個基本的幾何圖形(矩形、圓形、線條燈)

根元素:<shape/>    根元素的屬性:android:shape=["rectangle"|"oval"|"line"|"ring"]

子元素:<corners/>:設置整體或者四個邊角的弧度

           <gradient/>:漸變(可選擇漸變的角度但必須是45的倍數,默認為0,漸變的中心點,漸變的類型,漸變的半徑和開始和終止的顏色)

           <padding/>:內邊距 (可以控制四周的邊距)

           <size/>:形狀的大小 (設置形狀的寬高)

           <solid/>:單種顏色填充 

         

  <stroke/>:繪制邊框 (可設置畫筆的顏色和粗細 並 設置每畫一條線的長度和間距且必須兩者都設置才有效)

詳情參照:http://blog.csdn.net/lonelyroamer/article/details/8254592

實例:

<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    <corners android:radius="3dp"/>
    <padding android:left="7dp"
             android:right="7dp"
             android:bottom="7dp"
             android:top="7dp"/>
    <gradient android:angle="45"
              android:startColor="#0000"
              android:endColor="#ffff"/>
</shape>

 4.ClipDrawable

作用:從Drawable上截取一個“圖片片段”

根元素:<clip>  不使用子元素。

根元素屬性: android:drawable: 選定Drawable對象

                  android:clipOrientation:指定截取方向

                  android:gravity:從什么地方開始截取

總結:選定圖片並選擇方向與位置截取圖片

使用:從java中獲取ClipDrawable並用setLevel()改變截取大小 //setLevel()只能從0~10000

<!--res/drawable/test_clip.xml-->
<clip xmlns:android="http://schemas.android.com/apk/res/android"
    android:drawable="@mipmap/start"
    android:clipOrientation="horizontal"
    android:gravity="center">
</clip>
<!--res/layout/activity_main.xml-->
<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"
    tools:context="com.chen.android.test.MainActivity">

    <ImageView
        android:id="@+id/imageView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/test_clip"/>
</LinearLayout>
/*實現圖片漸漸展開的效果*/
public class MainActivity extends AppCompatActivity {
    int data = 0;
    int what = 0X11;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ImageView img = (ImageView)findViewById(R.id.imageView);
        //ImageView.getDrawable()獲取的是當前控件里的圖片,返回的是Drawable類型,還有說明Drawable對象可隨意變成子對象並調用子對象的方法
        final ClipDrawable clipDrawable = (ClipDrawable)img.getDrawable();
        //創建Handler等待計時器傳送的信息,使圖片擴展
        final Handler mHandler = new Handler(){

            @Override
            public void handleMessage(Message msg) {
                super.handleMessage(msg);
                if (msg.what == what){
                    clipDrawable.setLevel(data);//擴大截取的圖片面積
                    data += 200;
                }

            }
        };
        //創建計時器
        final Timer timer = new Timer();
        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                if (data >= 10000){
                    timer.cancel();
                }
                mHandler.obtainMessage(what).sendToTarget();
            }
        },0,300);
    }
}

5.AnimationDrawable

簡介:放在res/anim下,支持逐幀動畫和補間動畫

根元素:<set>   根元素屬性:android:interpolator="參數"   

                       參數:@android:anim/ 為開頭 選擇 linear_interpolator:勻速變換 | accelerate_interpolar:加速變換 | decelerate_interpolator:減速變換

                       android:shareInterpolator= "true|false" :是否讓資源的interpolator與根元素相同

                       android:duration="時間":定義持續時間

子元素(同樣可以設置duration):<alpha>:設置開始和結束的透明度

           <scale>:設置縮放的中心、開始的X,Y的尺寸和結束時X,Y的尺寸

           <translate>:設置圖片的開始位置和結束位置進行位移

           <rotate>:設置旋轉的中心、開始的角度和結束時候的角度

注意:利用android:fillAfter="true|false":設置保留后的狀態(哪個狀態想保留就用這個,如果都像就放在<set>中)

使用:利用AnimationUtils的靜態方法loadAninmation(Context context,int resId)

<!--在res/anim/test_animtaion中-->
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:interpolator="@android:anim/linear_interpolator"
    android:shareInterpolator="true"
    android:fillAfter="true">

    <alpha android:fromAlpha="50.0"
           android:toAlpha="100.0"
           />
    <scale android:pivotX="50%"
           android:pivotY="50%"
           android:fromXScale="1.0"
           android:fromYScale="1.0"
           android:toXScale="1.5"
           android:toYScale="1.5"
           android:duration="3000"
           />
    <translate android:fromXDelta="30"
               android:toXDelta="300"
               android:fromYDelta="40"
               android:toYDelta="90"
        android:duration="3000"/>

</set>
/*實現動畫*/
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ImageView img = (ImageView)findViewById(R.id.imageView);

        /*利用工具類獲取對象*/
        Animation animation= AnimationUtils.loadAnimation(this,R.anim.test_animation);
        /*將動畫附加在圖片上*/
        img.startAnimation(animation);
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM