1. 程式人生 > >Android的資源引用(2)(Drawable)

Android的資源引用(2)(Drawable)

一、Drawable資源通常存放在/res/drawable目錄下面。

二、圖片資源

圖片資源是最簡單的Drawable資源.只要把*.png,*.jpg,*.gif 等格式的圖片放入目錄下面就可以使用,Android SDK會在編譯時自動載入圖片,並在R資源清單中生成索引。

在java程式碼中使用R.drawable.file_name

三、StateListDrawable資源用於組織多個Drawable物件,StateListDrawable物件所顯示的會根據目標元件的狀態來改變。

定義StateListDrawable物件時的xml檔案的根元素是<selecto......../>,該元素包含多個<item..../>元素,該元素可指定如下的屬性,

android:color或者android:drawable:指定顏色或者Drawable物件

Android:state_Xxx:指定特定的一個狀態

 

其中有如下的狀態

 

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true" android:drawable="@drawable/p5rj" />  //按下時的背景圖片
    <item android:drawable="@drawable/p6txkt"></item>                        //原本的背景圖片
</selector>

沒按之前

按下之後

 

四、LayerDrawable資源

 

 

五、ShapDrawable資源

其根元素為<shap....../>

可指定如下的屬性:android:shape=["rectange"|"oval"|"line"|"ring"]指定那種幾何圖形

可定義四個角的幅度,定義漸變填充,定義內邊距,定義大小,定義單種顏色填充,定義幾何繪製邊框

 

 

 

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">  
    <item android:state_pressed="true">  //按下
        <shape>
            <gradient android:startColor="@color/colorButtonstart" android:endColor="@color/colorButtonend" android:type="radial" android:gradientRadius="90"/>
            <corners android:radius="10dp"/>
        </shape>
    </item>
    <item>  //正常
        <shape>
            <gradient android:startColor="@color/colorButtonstart0" android:endColor="@color/colorButtonend0" android:type="linear"/>
            <corners android:radius="10dp"/>
        </shape>
    </item>
</selector>

 

六、ClipDrawable資源

可指定如下的三個屬性:

android:drawable:指定擷取源

android:clipOrientation:指定擷取的方向,可水平,可垂直

android:gravity:指定擷取時的對齊方式

setLevel(int level)方法可以設定擷取的區域大小

 

徐徐展開的風景(例項)

(1)xml

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

(2)java程式碼

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ImageView imageView=findViewById(R.id.image_1);
        final ClipDrawable drawable=(ClipDrawable)imageView.getDrawable();

        final Handler handler=new Handler(){
            public void handleMessage(Message msg){
                if(msg.what==0x1233){
                    drawable.setLevel(drawable.getLevel()+200);
                }
            }
        };

        final Timer timer=new Timer();
        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                Message message=new Message();
                message.what=0x1233;
                handler.sendMessage(message);
                if(drawable.getLevel()>=10000){
                    timer.cancel();
                }
            }
        },0,50);

      }

}

 

 

七、AnimationDrawable

可指定如下的四個元素

alpha:設定透明度

scale:設定縮放

translate:設定圖片進行位移

rotate設定進行旋轉

 

 

 

 

 

例項動畫:

(1)xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:interpolator="@android:anim/linear_interpolator"
    android:duration="5000">
    <scale
        android:fromXScale="1.0"
        android:toXScale="1.4"
        android:fromYScale="1.0"
        android:toYScale="0.6"
        android:pivotX="50%"
        android:pivotY="50%"
        android:fillAfter="true"
        android:duration="2000"/>
    <translate
        android:fromXDelta="10"
        android:toXDelta="130"
        android:fromYDelta="30"
        android:toYDelta="-80"
        android:duration="2000"/>
</set>

(2)java程式碼

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ImageView imageView2=findViewById(R.id.image_2);
        final Animation animation= AnimationUtils.loadAnimation(this,R.anim.my_anim);
        animation.setFillAfter(true);   //動畫結束保留圖片變換結果
        imageView2.startAnimation(animation); //開始動畫

      }

}

     

  八、屬性動畫    

   

 

 

 

 

 

九、xml檔案的資源

 

 

例項解析xml檔案

(1)xml

<?xml version="1.0" encoding="utf-8"?>
<books>
    <book price="109" 出版社="西華大學">瘋狂的java</book>
    <book price="108" 出版社="成都理工">c++程式設計</book>
</books>

(2)解析的java程式碼

public class PropertyActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.property_activity);
       
        final TextView boos_d=findViewById(R.id.book_d);
        Button jx=findViewById(R.id.jx);
        jx.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                XmlResourceParser xrp=getResources().getXml(R.xml.books);
                try{
                    StringBuilder sb=new StringBuilder();
                    while (xrp.getEventType()!=XmlResourceParser.END_DOCUMENT){
                        if(xrp.getEventType()==XmlResourceParser.START_TAG){
                            String tagName=xrp.getName();
                            if(tagName.equals("book")){

                                //用名稱來獲取屬性值
                                String bookprice=xrp.getAttributeValue(null,"price");
                                sb.append("價格:"+bookprice+"  ");

                                //根據屬性的索引獲取屬性值
                                String bookcbs=xrp.getAttributeValue(1);
                                sb.append("出版社:"+bookcbs+"  ");

                                String bookName=xrp.nextText();
                                sb.append("書名:"+bookName);
                            }
                            sb.append("\n");
                            //一個book解析完成
                        }
                        xrp.next();
                    }
                    boos_d.setText(sb.toString());

                } catch (XmlPullParserException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        });

    }

}