1 Drawable Drawable
是一個通用的抽象類,它的目的是告訴你什麼東西是可以畫的。你會發現基於Drawable類擴展 出各種繪圖的類包括:BitmapDrawable ShapeDrawable PictureDrawable LayerDrawable,當然你 可以繼承它來創建你自己的繪圖類. 有三種方法可以定義和實例化一個Drawable,保存一個圖片到你工程資源中,使用XML文件來描述 Drawable屬性或者用一個正常的類去構造。下面我們將討論兩種技術(對一個有開發經驗的開發者來說構 造並不是最新的技術)
1.1 從資源圖像文件中創建 一個比較簡單的方法是添加一個圖片到你的程序中,然後通過資源文件引用這個文件,支持的文件類型 有PNG(首選的) JPG(可接受的)GIF(不建議),顯然這種對於顯示應用程序的圖標跟來說是首選的方 法,也可以用來顯示LOGO,其餘的圖片可以用在例如遊戲中。 把一個圖片資源,添加你的文件到你工程中res/drawable/目錄中去,從這裏,你就可以引用它到你的代碼 或你的XML佈局中,另一種方法,引用它也可以用資源編號,比如你選擇一個文件只要去掉後綴就可以了 (例如:my_image.png 引用它是就是my_image)
1.2 從XML文件中創建 到如今,你應該比較熟悉按Android的原則去開發一個用戶接口,因此,你也應該理解了定義一個XML文 件對於對象的作用與靈活的重要性。這個理念無數次用於Drawables 如果你想創建一個Drawable對象,而這個對象並不依賴於變量或用戶的交換,把它定義到XML中去應該 是一個不錯的方法。即使你期望在你的應用程序中改變其屬性來增加用戶體驗。你應該考慮把對象放入 XML中,因爲你可以隨時修改其屬性。 當你在你的XML中定義了一個Drawable,保存這個XML文件到你工程目錄下res/drawable目錄中,然 後通過調用Resource.getDrawable()來檢索並實例化,傳遞給它XML文件中的資源ID號。 任何Drawable的子類都支持inflate這個方法,這個方法會通過XML來實例化你的程序。任何Drawable 都支持XML的擴展來利用特殊的XML屬性來幫助定義對象的屬性,可以查看任何Drawable子類文檔來看 如何定義XML文件 下面的XML定義了TransitionDrawable:
<item android:drawable="@drawable/image_expand">
<item android:drawable="@drawable/image_collapse">
</transition>
2 ShapeDrawable
private ShapeDrawable mDrawable;
public CustomDrawableView(Context context) {
super(context);
int x = 10;
int y = 10;
int width = 300;
int height = 50;
mDrawable = new ShapeDrawable(new OvalShape());
mDrawable.getPaint().setColor(0xff74AC23);
mDrawable.setBounds(x, y, x + width, y + height);
}
protected void onDraw(Canvas canvas) {
mDrawable.draw(canvas);
}
}
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mCustomDrawableView = new CustomDrawableView(this);
setContentView(mCustomDrawableView);
}
android:layout_width="fill_parent"
android:layout_height="wrap_content"/>
ShapeDrawable類(像很多其他Drawable類型在android.graphics.drawable包)允許你定義drawable公共方法的各種屬性。有些屬性你可以需要調整,包括,透明度,顏色過濾,不透明度,顏色。
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_centerInParent="true"
android:text="Tiny"
android:textSize="8sp"
android:background="@drawable/my_button_background"/>
<Button id="@+id/big"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_centerInParent="true"
android:text="Biiiiiiig text!"
android:textSize="30sp"
android:background="@drawable/my_button_background"/>
4 Tween Animation
一個tween動畫將對視圖對象中的內容進行一系列簡單的轉換(位置,大小,旋轉,透明性)。如果你有 一個文本視圖對象,你可以移動它,旋轉它,讓它變大或讓它變小,如果文字下面還有背景圖像,背景 圖像也會隨着文件進行轉換。Animation package 提供了所有的類來供tween 動畫使用。 Tween 動畫定義了一個動畫指令的隊列,定義可以使用XML也可以再Android的代碼中,像定義佈局一 樣,我們建議使用XML來定義,因爲它具備的閱讀性,重用性,可以交換性大大超過了硬編碼。在下面 的例子中,我們使用XML(參考AnimationSet 類或者其它的動畫類來學習如何在代碼中定義) 動畫的指令定義了你想要發生什麼樣的轉換,當他們發生了,應該執行多長時間,轉換可以是連續的也 可以使同時的。例如,你讓文本內容從左邊移動到右邊,然後旋轉180度,或者在移動的過程中同時旋 轉,沒個轉換需要設置一些特殊的參數(開始和結束的大小尺寸的大小變化,開始和結束的旋轉角度等 等,也可以設置些基本的參數(例如,開始時間與週期),如果讓幾個轉換同時發生,可以給它們設置 相同的開始時間,如果按序列的話,計算開始時間加上其週期。 動畫的XML文件還是在你工程中res/anim目錄,這個文件必須包含一個根元素,可以使<alpha> <scale> <translate> <rotate> 插值元素或者是把上面的元素都放入<set>元素組中,默認情況下,所以的動畫指令都是同時發生的, 爲了讓他們按序列發生,需要設置一個特殊的屬性startOffset,下面的例子會演示。 下面的ApiDemos XML文件定義了視圖對象的伸縮功能,同時發生旋轉 。
android:interpolator="@android:anim/
accelerate_decelerate_interpolator"
android:fromXScale="1.0"
android:toXScale="1.4"
android:fromYScale="1.0"
android:toYScale="0.6"
android:pivotX="50%"
android:pivotY="50%"
android:fillAfter="false"
android:duration="700" />
<set android:interpolator="@android:anim/decelerate_interpolator">
<scale
android:fromXScale="1.4"
android:toXScale="0.0"
android:fromYScale="0.6"
android:toYScale="0.0"
android:pivotX="50%"
android:pivotY="50%"
android:startOffset="700"
android:duration="400"
android:fillBefore="false" />
<rotate
android:fromDegrees="0"
android:toDegrees="-45"
android:toYScale="0.0"
android:pivotX="50%"
android:pivotY="50%"
android:startOffset="700"
android:duration="400" />
</set></set>
Animation hyperspaceJumpAnimation = AnimationUtils.loadAnimation(this,
R.anim.hyperspace_jump);
spaceshipImage.startAnimation(hyperspaceJumpAnimation);
5 Frame Animation
雖然你可以在代碼中定義幀動畫,可以使用AnimationDrawable類的API.,它是非常簡單通過XML文件 列出動畫中的所有幀,像上面的動畫tween,這種類別動畫的XML文件放入工程中的res/anim目錄。既 然這樣,指令按照週期去執行每幀動畫。 在XML文件包含一個<animation-list>根節點元素和好幾個子節點<item>來定義每幀。一個資源分別定 義了幀的名字與幀的持續時間。下面爲範例:
<item android:drawable="@drawable/rocket_thrust1"
android:duration="200" />
<item android:drawable="@drawable/rocket_thrust2"
android:duration="200" />
<item android:drawable="@drawable/rocket_thrust3"
android:duration="200" />
</animation-list>
這個動畫播放三個幀動畫,通過設置android:oneshot屬性爲true,它將會在最後一幀停下來,如果設置 爲false這個動畫將循環播放。這個文件保存到工程目錄res/anim目錄下爲rocket_thrust.xml,你也 可以添加一個背景圖片到視圖中,然後開始播放。下面爲範例:
publicvoid onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
ImageView rocketImage = (ImageView) findViewById(R.id.rocket_image);
rocketImage.setBackgroundResource(R.anim.rocket_thrust);
rocketAnimation = (AnimationDrawable) rocketImage.getBackground();
}
public boolean onTouchEvent(MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
rocketAnimation.start();
return true;
}
return super.onTouchEvent(event);
}
一個比較需要特別注意的是,在AnimationDrawable調用onCreate()過程中不能調用start(),這是因 爲AnimationDrawable不能在不完全的窗口上運行,如果你想立即播放動畫,沒有必要的交互,你可以 再onWindowFocusChanged()方法中調用它。這樣它將成爲窗口焦點。