Android學習之合理利用標籤美化UI

簡介

表示的是一種圖像的概念,但是又不全是圖片,更可以通過顏色也可以構造出各種各樣的圖片效果。
一般通過XML來定義,在Android設計中,Drawable是一個抽象的類,具體如下圖:
Drawable的內部寬/高這兩個參數比較重要,可以通過getIntrinsicWidth 和 getIntrinsicHeight兩種方式
獲取,但是並不是所有的Drawable都有內部寬/高,比如,一張圖片的Drawable,就有,但是顏色所形成的就沒有
它其實沒有寬高概念,當用作View的背景時,Drawable會被拉伸到View的同等大小。


這裏寫圖片描述

這裏寫圖片描述

這裏主要是介紹了:
ClipDrawable
InsetDrawable
LayerDrawable
LevelListDrawable
ShapeDrawable
TransitionDrawable
RotateDrawable
ScaleDrawable


ClipDrawable介紹

簡介
ClipDrawable對應於< clip >標籤,它可以根據自己當前的等級(level)來裁剪另一個Drawable。
效果描述
可以用clip標籤對一張圖片進行修飾,然後可以設定某一level值可以截取原圖上相應的部分進行展示。比如設置level爲1000,那麼只能展示圖片的十分之一,如果爲9000則能展示圖片的十分之九。這裏的level可以理解爲範圍,展示原來圖片多大範圍內的內容。
代碼一

先在drawable資源目錄下面建立clip標籤爲根標籤的文件,裏面代碼內容如下:
<clip xmlns:android="http://schemas.android.com/apk/res/android"
    android:clipOrientation="vertical"
    android:drawable="@drawable/ss"
    android:gravity="center"
    />
    /**上述代碼中:clipOrientation表示裁剪方向,可以選擇水平或者豎直方向
     drawable表示針對哪一張圖片進行操作
     gravity表示裁剪是從哪裏入手,初始時候操作哪裏,比如center表示開始根據level從中間裁剪
     需要注意一點,如果你是豎直方向,但是你gravity設置的left,這樣兩個方向是衝突的,
     就會實現不了*/

代碼二

就是在佈局文件中使用,如下:
 <ImageView
        android:id="@+id/imageView_myclip"
        android:src="@drawable/myclip"
        android:layout_centerInParent="true"
        android:layout_width="200dp"
        android:layout_height="200dp" />

代碼三

只是上述部分還不能完成展示,還需要手動的設置level值,一張圖片一般會被分成1000層,
0表示一點也不顯示:
 int lev = clipImageView.getDrawable().getLevel();
 //上述方法可以得到當前圖片的level值
 clipImageView.getDrawable().setLevel(minlevel);
  //上述代碼可以設置當前圖片的level值

代碼四

常常利用clip標籤修飾來完成一個動態加載出本張圖片的效果(從無到有),如:
clipImageView = (ImageView) findViewById(R.id.imageView_myclip);
clipImageView.post(cliping);
//上述只是粘貼的主要代碼
private Runnable cliping = new Runnable() {
        @Override
        public void run() {
            if (minlevel<10000){
                minlevel += 200;
                clipImageView.getDrawable().setLevel(minlevel);
                clipImageView.postDelayed(cliping,200);
            }
        }
    };
    /**clipImageView.post()表示使用view裏面自帶的handler這是運行在主線程中的。
       clipImageView.postDelayed()表示在200ms之後在重新設置圖片的level
       這樣就實現了一張圖片動態加載出來的過程,類似與網頁上圖片加載類似,一點點出來。
    */

InsetDrawable

介紹
它一般是在要求圖片比背景要小的時候用,類似與padding屬性,但是又有所不同。
padding 指的是View裏面內容區域和View的邊界的距離,如果padding的值足夠大,
那麼內容區域就會變的不可見,但是inset不同,它是相當於將一個drawable嵌入進另
一個View中(按照其指定的距離來決定),
代碼一

<inset xmlns:android="http://schemas.android.com/apk/res/android"
    android:insetBottom="30dp"
    android:insetLeft="40dp"
    android:insetRight="10dp"
    android:insetTop="50dp"
    android:drawable="@drawable/ss"
    >
    /**使用較爲簡單,還可以直接設定android:inset屬性,但是這個效果只有5.0纔有效果     
    還可以設定android:visibl設置是否可見*/

代碼二

 <ImageView
        android:background="#ea8585"
        android:id="@+id/imageView_myclip"
        android:src="@drawable/myinsert"
        android:layout_centerInParent="true"
        android:layout_width="300dp"
        android:layout_height="300dp" />

效果圖
這裏寫圖片描述


LayerDrawable

介紹
可以完成將多張圖片進行疊加,其實使用layer_list標籤可以看成是生成了一個空間(容器),然後你可以往這個容器中添加圖片,進行展示。
代碼一

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">

    <item>
        <bitmap android:src="@drawable/ss"
            android:gravity="center" />
    </item>
    <item android:top="100dp" android:left="100dp">
        <bitmap android:src="@drawable/ss"
            android:gravity="center" />
    </item>
    <item android:top="200dp" android:left="200dp">
        <bitmap android:src="@drawable/ss"
            android:gravity="center" />
    </item>
</layer-list>
/**android:top之類的屬性可以認爲是相距layer_list邊界的距離*/

代碼二

<ImageView
        android:src="@drawable/mylayerlist"
        android:id="@+id/imageView_myclip"
        android:layout_centerInParent="true"
        android:layout_width="200dp"
        android:layout_height="200dp"
        />

代碼三

這樣操作之後就可以顯示了,如下:

這裏寫圖片描述


LevelListDrawable

介紹
可以管理一組可以進行切換的圖片,給每一張圖片設置上level值,然後代碼可以控制level水平,那麼系統就會自動匹配相應的圖片。如果要是沒有響應水平對應的圖片的話,就會顯示空白。另外需要注意的是,item的放置前後順序需要注意,系統會自上往下匹配,如果查找到item符合當前的狀態,就不會向下去查找其他item,需要注意的是,圖片切換時候沒有過渡過程。
代碼一

<level-list xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:drawable="@drawable/ic_launcher"
        android:maxLevel="10"
        android:minLevel="0"/>

    <item android:drawable="@drawable/ss"
        android:maxLevel="60"
        android:minLevel="40"
        />

</level-list>

代碼二

<ImageView
        android:id="@+id/imageView_myclip"
        android:src="@drawable/mylevel_list"
        android:layout_centerInParent="true"
        android:layout_width="300dp"
        android:layout_height="300dp" />

代碼三

依舊需要代碼中動態設置level水平值。
如果你是用作的背景,那麼:
imageViwe.getBackgroud().setlevel();
如果你是用的圖片,那麼:
imageView.setImageLevel();
//需要注意的一點是,如果在相對應的level水平中沒有相對應的圖,那麼就會顯示空白的

ShapeDrawable**

更像是畫出自己需要的樣式出來,在使用的時候,可以當做是drawable類型的圖片去使用就可以。使用起來比較靈活,一些控件完全不需要自定義,直接畫出來就好了。
屬性介紹

在shape的根標籤中:
android:shape=" "可以選擇: 
  rectangle 矩形 
  oval 橢圓
  line 水平直線
  ring 環形
  /**先確定想要繪製的是什麼樣式的drawable*/

<gradient> 漸變子標籤 ,可以實現顏色的漸變,裏面的屬性有:
  android:startColor  起始顏色
  android:centerColor 中間顏色
  android:endColor  結束顏色
  android:angle  漸變角度,0從左到右,90表示從下到上,數值爲 45的整數倍數,默認爲0
  android:type  漸變的樣式 liner線性漸變  radial環形漸變  sweep 掃視漸變
  /***這是可選子標籤之一,可以確定漸變的顏色,其中,angle表示角度,可以理解爲決定了矢量,漸變的主要方向。/

<solid>  填充顏色子標籤,填充的是背景顏色,是shape的背景顏色。
    android:color  填充的顏色

<stroke> 描邊子標籤,針對於邊界線進行介紹。
    ndroid:width 邊界線的寬度
    android:color 邊界線的顏色
    android:dashWidth 表示'-' 破折號的寬度。代表的是虛線
    android:dashGap 表示'-' 破折號之間的距離
    /**Android 4.0之後要想出現虛線效果,需要在這裏面單獨配置layerType屬性纔可以*/

<corners> 圓角子標籤,可以使當前的shape有圓角效果。
    android:radius  圓角的半徑 值越大角越圓
    android:topRightRadius  右上圓角半徑
    android:bottomLeftRadius 右下圓角角半徑
    android:topLeftRadius 左上圓角半徑
    android:bottomRightRadius 左下圓角半徑
    /**針對與四個角的一些設置*/
size標籤
<size
        android:width="20dp"
        android:height="20dp" />
        其實就這兩個屬性,表示的是shape的大小,但並不是沒有意義的,比如你選擇的是橢圓,然後這裏在設置尺寸的時候,設置成一樣的,那麼就會變成圓了。

TransitionDrawable

介紹
只能管理兩層drawable,另外提供了兩層drawable之間切換的方法,切換時還會有淡入淡出的動畫效果。
代碼一

<transition xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/ic_launcher" />
    <item
        android:drawable="@drawable/ss"
        android:top="100dp"
        >
    </item>
</transition>
/**上述代碼所示,可以實現從ic_launcher到ss圖片的變化,但是,這裏不同的是多了一種過渡的效果。
不在是單純的直接就變化了,有一層朦朧感覺其中android:top="100dp"正常邏輯是轉換完成後原來的看不見了,但是加上top之後,在轉換完成後以前的圖片依舊可以看見100dp的部分。*/

代碼二

<ImageView
        android:src="@drawable/mytransition"
        android:id="@+id/imageView_myclip"
        android:layout_centerInParent="true"
        android:layout_width="300dp"
        android:layout_height="300dp"
        />

代碼三

 private TransitionDrawable ts;
 clipImageView = (ImageView) findViewById(R.id.imageView_myclip);
 ts = (TransitionDrawable) clipImageView.getDrawable();
 //這兩個是控制變化效果的關鍵代碼
 ts.startTransition(1000);//表示,由一到了二,在變化時候,會出現過渡效果,但依舊是二圖片
 ts.reverseTransition(2000);//表示,由一變到二,在變化時候,是從二變到一

RotateDrawable

介紹
首先這不是動畫,直觀的效果就是可以讓圖片旋轉某個角度,一般圖片都是平放置的,而這個標籤,可以使得圖片進行旋轉一定角度放置。
代碼一

需要在res/drawable文件夾下面建立以rotate爲根標籤的XML文件:
<rotate xmlns:android="http://schemas.android.com/apk/res/android"
    android:drawable="@drawable/ss"
    android:fromDegrees="180"
    android:pivotX="50%"
    android:pivotY="50%"
    android:toDegrees="360"
    >
</rotate>
/**fromDegrees:表示從哪個角度(位置)開始,toDegrees:表示到那個角度(位置)結束
 pivotX:表示X軸的重心,pivotY:表示y軸的重心*/

代碼二

在佈局文件XML中使用:
    <ImageView
        android:src="@drawable/myrotate"
        android:id="@+id/imageView_myclip"
        android:layout_centerInParent="true"
        android:layout_width="30dp"
        android:layout_height="30dp"
        />

代碼三

還有一個重要的屬性,就是level,rotate標籤將整個fromDegress 到 toDegress過程
分爲了10000份,所以還需要手動設置level水平,系統可以根據你的水平,從過程中扣出相
匹配的圖來
clipImageView.getDrawable().setLevel(minlevel);
//上述代碼就是動態設置水平的關鍵代碼。

代碼四

完全可以模仿成動畫的效果,那種旋轉效果:
  clipImageView = (ImageView) findViewById(R.id.imageView_myclip);
  clipImageView.post(cliping);
  //上述代碼一般是在onCreate()方法裏面完成。
  private Runnable cliping = new Runnable() {
        @Override
        public void run() {
            if (minlevel<10000){
                minlevel += 200;
                clipImageView.getDrawable().setLevel(minlevel);
            }
        }
    };

ScaleDrawable

介紹
字面解釋就是縮放,就是將一張圖片進行縮小/放大。
代碼一

在res/drawable文件夾下面:
<scale xmlns:android="http://schemas.android.com/apk/res/android"
    android:drawable="@drawable/ic_launcher"
    android:scaleGravity="center"
    android:scaleHeight="50%"
    android:scaleWidth="50%"
    >
</scale>
/**這裏以scale爲根標籤scaleGravity:表示縮放重心,scaleHeight:表示縮放高度,
   scaleWidth:表示縮放寬度*/

代碼二

 <ImageView
        android:src="@drawable/myscale"
        android:id="@+id/imageView_myclip"
        android:layout_centerInParent="true"
        android:layout_width="100dp"
        android:layout_height="100dp"
        />

代碼三

 clipImageView.getDrawable().setLevel(minlevel);
 //此行代碼是關鍵代碼,和rotate一樣,必須指定level水平,從完成上述過程中提取某一個部分出來,纔會有效果圖展示。

*代碼四

可以模仿動畫中的那種效果,關鍵代碼如下:
clipImageView = (ImageView) findViewById(R.id.imageView_myclip);
clipImageView.post(cliping);
//上述一般是在onCreate()方法裏面去完成。
private Runnable cliping = new Runnable() {
        @Override
        public void run() {
            if (minlevel<10000){
                minlevel += 500;
                clipImageView.getDrawable().setLevel(minlevel);
                clipImageView.postDelayed(cliping,200);
            }
        }
    };

總結

通過上面的整理,發現可以通過標籤就可以完成許多效果圖,比如:
clip標籤、rotate標籤、scale標籤、level_list標籤分別描述了剪切、旋轉、縮放、都是描述了一個過程,然後代碼中通過level水平來顯示某一時刻對應的圖,而且也能讓其完整的展示出過程出來(前面參考代碼四)
shape標籤、transition標籤、layer_list標籤、inset標籤等等測試在圖片上進行了修飾,上面只是單純的介紹了每個標籤怎麼使用,一般項目中都是多個標籤相互嵌套去使用。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章