1. 程式人生 > >Android動畫學習筆記-Android Animation

Android動畫學習筆記-Android Animation

轉自:http://www.cnblogs.com/angeldevil/archive/2011/12/02/2271096.html

3.0以前,android支援兩種動畫模式,tween animation,frame animation,在android3.0中又引入了一個新的動畫系統:property animation,這三種動畫模式在SDK中被稱為property animation,view animation,drawable animation。 可通過NineOldAndroids專案在3.0之前的系統中使用Property Animation

1. View Animation(Tween Animation)

View Animation(Tween Animation):補間動畫,給出兩個關鍵幀,通過一些演算法將給定屬性值在給定的時間內在兩個關鍵幀間漸變。

View animation只能應用於View物件,而且只支援一部分屬性,如支援縮放旋轉而不支援背景顏色的改變。

而且對於View animation,它只是改變了View物件繪製的位置,而沒有改變View物件本身,比如,你有一個Button,座標(100,100),Width:200,Height:50,而你有一個動畫使其變為Width:100,Height:100,你會發現動畫過程中觸發按鈕點選的區域仍是(100,100)-(300,150)。

View Animation就是一系列View形狀的變換,如大小的縮放,透明度的改變,位置的改變,動畫的定義既可以用程式碼定義也可以用XML定義,當然,建議用XML定義。

可以給一個View同時設定多個動畫,比如從透明至不透明的淡入效果,與從小到大的放大效果,這些動畫可以同時進行,也可以在一個完成之後開始另一個。

用XML定義的動畫放在/res/anim/資料夾內,XML檔案的根元素可以為<alpha>,<scale>,<translate>,<rotate>,interpolator元素或<set>(表示以上幾個動畫的集合,set可以巢狀)。預設情況下,所有動畫是同時進行的,可以通過startOffset屬性設定各個動畫的開始偏移(開始時間)來達到動畫順序播放的效果。

可以通過設定interpolator屬性改變動畫漸變的方式,如AccelerateInterpolator,開始時慢,然後逐漸加快。預設為AccelerateDecelerateInterpolator。

定義好動畫的XML檔案後,可以通過類似下面的程式碼對指定View應用動畫。

ImageView spaceshipImage = (ImageView)findViewById(R.id.spaceshipImage);
Animation hyperspaceJumpAnimation=AnimationUtils.loadAnimation(this, R.anim.hyperspace_jump);
spaceshipImage.startAnimation(hyperspaceJumpAnimation);

2. Drawable Animation(Frame Animation)

Drawable Animation(Frame Animation):幀動畫,就像GIF圖片,通過一系列Drawable依次顯示來模擬動畫的效果。在XML中的定義方式如下:

複製程式碼
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"     android:oneshot="true">     <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>
複製程式碼

必須以<animation-list>為根元素,以<item>表示要輪換顯示的圖片,duration屬性表示各項顯示的時間。XML檔案要放在/res/drawable/目錄下。示例:

複製程式碼
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub super.onCreate(savedInstanceState);
setContentView(R.layout.main);
imageView = (ImageView) findViewById(R.id.imageView1);
imageView.setBackgroundResource(R.drawable.drawable_anim);
anim = (AnimationDrawable) imageView.getBackground();
}

public boolean onTouchEvent(MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
anim.stop();
anim.start();
return true;
}
return super.onTouchEvent(event);
}
複製程式碼

我在實驗中遇到兩點問題:

  1. 要在程式碼中呼叫Imageview的setBackgroundResource方法,如果直接在XML佈局檔案中設定其src屬性當觸發動畫時會FC。
  2. 在動畫start()之前要先stop(),不然在第一次動畫之後會停在最後一幀,這樣動畫就只會觸發一次。
  3. 最後一點是SDK中提到的,不要在onCreate中呼叫start,因為AnimationDrawable還沒有完全跟Window相關聯,如果想要介面顯示時就開始動畫的話,可以在onWindowFoucsChanged()中呼叫start()。

3. Property Animation

屬性動畫,這個是在Android 3.0中才引進的,以前學WPF時裡面的動畫機制好像就是這個,它更改的是物件的實際屬性,在View Animation(Tween Animation)中,其改變的是View的繪製效果,真正的View的屬性保持不變,比如無論你在對話中如何縮放Button的大小,Button的有效點選區域還是沒有應用動畫時的區域,其位置與大小都不變。而在Property Animation中,改變的是物件的實際屬性,如Button的縮放,Button的位置與大小屬性值都改變了。而且Property Animation不止可以應用於View,還可以應用於任何物件。Property Animation只是表示一個值在一段時間內的改變,當值改變時要做什麼事情完全是你自己決定的。

在Property Animation中,可以對動畫應用以下屬性:

  • Duration:動畫的持續時間
  • TimeInterpolation:屬性值的計算方式,如先快後慢
  • TypeEvaluator:根據屬性的開始、結束值與TimeInterpolation計算出的因子計算出當前時間的屬性值
  • Repeat Count and behavoir:重複次數與方式,如播放3次、5次、無限迴圈,可以此動畫一直重複,或播放完時再反向播放
  • Animation sets:動畫集合,即可以同時對一個物件應用幾個動畫,這些動畫可以同時播放也可以對不同動畫設定不同開始偏移
  • Frame refreash delay:多少時間重新整理一次,即每隔多少時間計算一次屬性值,預設為10ms,最終重新整理時間還受系統程序排程與硬體的影響

3.1 Property Animation的工作方式

對於下圖的動畫,這個物件的X座標在40ms內從0移動到40 pixel.按預設的10ms重新整理一次,這個物件會移動4次,每次移動40/4=10pixel。

也可以改變屬性值的改變方法,即設定不同的interpolation,在下圖中運動速度先逐漸增大再逐漸減小

下圖顯示了與上述動畫相關的關鍵物件

ValueAnimator  表示一個動畫,包含動畫的開始值,結束值,持續時間等屬性。

ValueAnimator封裝了一個TimeInterpolator,TimeInterpolator定義了屬性值在開始值與結束值之間的插值方法。

ValueAnimator還封裝了一個TypeAnimator,根據開始、結束值與TimeIniterpolator計算得到的值計算出屬性值。

ValueAnimator根據動畫已進行的時間跟動畫總時間(duration)的比計算出一個時間因子(0~1),然後根據TimeInterpolator計算出另一個因子,最後TypeAnimator通過這個因子計算出屬性值,如上例中10ms時:

首先計算出時間因子,即經過的時間百分比:t=10ms/40ms=0.25

經插值計算(inteplator)後的插值因子:大約為0.15,上述例子中用了AccelerateDecelerateInterpolator,計算公式為(input即為時間因子):

(Math.cos((input + 1) * Math.PI) / 2.0f) + 0.5f;  

最後根據TypeEvaluator計算出在10ms時的屬性值:0.15*(40-0)=6pixel。上例中TypeEvaluator為FloatEvaluator,計算方法為 :

public Float evaluate(float fraction, Number startValue, Number endValue) {     float startFloat = startValue.floatValue();     return startFloat + fraction * (endValue.floatValue() - startFloat); }

引數分別為上一步的插值因子,開始值與結束值。

3.2 ValueAnimator

ValueAnimator包含Property Animation動畫的所有核心功能,如動畫時間,開始、結束屬性值,相應時間屬性值計算方法等。應用Property Animation有兩個步聚:

  1. 計算屬性值
  2. 根據屬性值執行相應的動作,如改變物件的某一屬性。

ValuAnimiator只完成了第一步工作,如果要完成第二步,需要實現ValueAnimator.onUpdateListener介面,這個介面只有一個函式onAnimationUpdate(),在這個函式中會傳入ValueAnimator物件做為引數,通過這個ValueAnimator物件的getAnimatedValue()函式可以得到當前的屬性值如:

複製程式碼
ValueAnimator animation = ValueAnimator.ofFloat(0f, 1f);
animation.setDuration(1000);
animation.addUpdateListener(new AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
Log.i("update", ((Float) animation.getAnimatedValue()).toString());
}
});
animation.setInterpolator(new CycleInterpolator(3));
animation.start();
複製程式碼

此示例中只是向Logcat輸出了一些資訊,可以改為想做的工作。

Animator.AnimatorListener

複製程式碼
onAnimationStart()  onAnimationEnd()  onAnimationRepeat()  //當動畫被取消時呼叫,同時會呼叫onAnimationEnd(). onAnimationCancel()
複製程式碼

ValueAnimator.AnimatorUpdateListener

onAnimationUpdate()  //通過監聽這個事件在屬性的值更新時執行相應的操作,對於ValueAnimator一般要監聽此事件執行相應的動作,不然Animation沒意義,在ObjectAnimator(繼承自ValueAnimator)中會自動更新屬性,如無必要不必監聽。在函式中會傳遞一個ValueAnimator引數,通過此引數的getAnimatedValue()取得當前動畫屬性值。

可以繼承AnimatorListenerAdapter而不是實現AnimatorListener介面來簡化操作,這個類對AnimatorListener中的函式都定義了一個空函式體,這樣我們就只用定義想監聽的事件而不用實現每個函式卻只定義一空函式體。

複製程式碼
ObjectAnimator oa=ObjectAnimator.ofFloat(tv, "alpha", 0f, 1f); oa.setDuration(3000); oa.addListener(new AnimatorListenerAdapter(){     public void on AnimationEnd(Animator animation){         Log.i("Animation","end");     } }); oa.start();
複製程式碼

3.3 ObjectAnimator

繼承自ValueAnimator,要指定一個物件及該物件的一個屬性,當屬性值計算完成時自動設定為該物件的相應屬性,即完成了Property Animation的全部兩步操作。實際應用中一般都會用ObjectAnimator來改變某一物件的某一屬性,但用ObjectAnimator有一定的限制,要想使用ObjectAnimator,應該滿足以下條件:

  • 物件應該有一個setter函式:set<PropertyName>(駝峰命名法)
  • 如上面的例子中,像ofFloat之類的工場方法,第一個引數為物件名,第二個為屬性名,後面的引數為可變引數,如果values…引數只設置了一個值的話,那麼會假定為目的值,屬性值的變化範圍為當前值到目的值,為了獲得當前值,該物件要有相應屬性的getter方法:get<PropertyName>
  • 如果有getter方法,其應返回值型別應與相應的setter方法的引數型別一致。

如果上述條件不滿足,則不能用ObjectAnimator,應用ValueAnimator代替。

複製程式碼
tv=(TextView)findViewById(R.id.textview1); btn=(Button)findViewById(R.id.button1); btn.setOnClickListener(new OnClickListener() {   @Override   public void onClick(View v) {     ObjectAnimator oa=ObjectAnimator.ofFloat(tv, "alpha", 0f, 1f);     oa.setDuration(3000);     oa.start();   } });
複製程式碼

把一個TextView的透明度在3秒內從0變至1。

根據應用動畫的物件或屬性的不同,可能需要在onAnimationUpdate函式中呼叫invalidate()函式重新整理檢視。

3.4 通過AnimationSet應用多個動畫

AnimationSet提供了一個把多個動畫組合成一個組合的機制,並可設定組中動畫的時序關係,如同時播放,順序播放等。

以下例子同時應用5個動畫:

  1. 播放anim1;
  2. 同時播放anim2,anim3,anim4;
  3. 播放anim5。
AnimatorSet bouncer = new AnimatorSet(); bouncer.play(anim1).before(anim2); bouncer.play(anim2).with(anim3); bouncer.play(anim2).with(anim4) bouncer.play(anim5).after(amin2); animatorSet.start();

3.5 TypeEvalutors

根據屬性的開始、結束值與TimeInterpolation計算出的因子計算出當前時間的屬性值,android提供了以下幾個evalutor:

  • IntEvaluator:屬性的值型別為int;
  • FloatEvaluator:屬性的值型別為float;
  • ArgbEvaluator:屬性的值型別為十六進位制顏色值;
  • TypeEvaluator:一個介面,可以通過實現該介面自定義Evaluator。

自定義TypeEvalutor很簡單,只需要實現一個方法,如FloatEvalutor的定義:

複製程式碼
public class FloatEvaluator implements TypeEvaluator {     public Object evaluate(float fraction, Object startValue, Object endValue) {         float startFloat = ((Number) startValue).floatValue();         return startFloat + fraction * (((Number) endValue).floatValue() - startFloat);     } }
複製程式碼

根據動畫執行的時間跟應用的Interplator,會計算出一個0~1之間的因子,即evalute函式中的fraction引數,通過上述FloatEvaluator應該很好看出其意思。

3.6 TimeInterplator

Time interplator定義了屬性值變化的方式,如線性均勻改變,開始慢然後逐漸快等。在Property Animation中是TimeInterplator,在View Animation中是Interplator,這兩個是一樣的,在3.0之前只有Interplator,3.0之後實現程式碼轉移至了TimeInterplator。Interplator繼承自TimeInterplator,內部沒有任何其他程式碼。

  • AccelerateInterpolator          加速,開始時慢中間加速
  • DecelerateInterpolator         減速,開始時快然後減速
  • AccelerateDecelerateInterolator    先加速後減速,開始結束時慢,中間加速
  • AnticipateInterpolator        反向 ,先向相反方向改變一段再加速播放
  • AnticipateOvershootInterpolator    反向加回彈,先向相反方向改變,再加速播放,會超出目的值然後緩慢移動至目的值
  • BounceInterpolator         跳躍,快到目的值時值會跳躍,如目的值100,後面的值可能依次為85,77,70,80,90,100
  • CycleIinterpolator         迴圈,動畫迴圈一定次數,值的改變為一正弦函式:Math.sin(2 * mCycles * Math.PI * input)
  • LinearInterpolator         線性,線性均勻改變
  • OvershottInterpolator        回彈,最後超出目的值然後緩慢改變到目的值
  • TimeInterpolator           一個介面,允許你自定義interpolator,以上幾個都是實現了這個介面

3.7 當Layout改變時應用動畫

ViewGroup中的子元素可以通過setVisibility使其Visible、Invisible或Gone,當有子元素可見性改變時(VISIBLE、GONE),可以向其應用動畫,通過LayoutTransition類應用此類動畫:

transition.setAnimator(LayoutTransition.DISAPPEARING, customDisappearingAnim);

通過setAnimator應用動畫,第一個引數表示應用的情境,可以以下4種類型:

  • APPEARING        當一個元素在其父元素中變為Visible時對這個元素應用動畫
  • CHANGE_APPEARING    當一個元素在其父元素中變為Visible時,因系統要重新佈局有一些元素需要移動,對這些要移動的元素應用動畫
  • DISAPPEARING       當一個元素在其父元素中變為GONE時對其應用動畫
  • CHANGE_DISAPPEARING   當一個元素在其父元素中變為GONE時,因系統要重新佈局有一些元素需要移動,這些要移動的元素應用動畫.

第二個引數為一Animator。

mTransitioner.setStagger(LayoutTransition.CHANGE_APPEARING, 30);

此函式設定動畫延遲時間,引數分別為型別與時間。

3.8 Keyframes

keyFrame是一個 時間/值 對,通過它可以定義一個在特定時間的特定狀態,即關鍵幀,而且在兩個keyFrame之間可以定義不同的Interpolator,就好像多個動畫的拼接,第一個動畫的結束點是第二個動畫的開始點。KeyFrame是抽象類,要通過ofInt(),ofFloat(),ofObject()獲得適當的KeyFrame,然後通過PropertyValuesHolder.ofKeyframe獲得PropertyValuesHolder物件,如以下例子:

複製程式碼
Keyframe kf0 = Keyframe.ofInt(0, 400); Keyframe kf1 = Keyframe.ofInt(0.25f, 200); Keyframe kf2 = Keyframe.ofInt(0.5f, 400); Keyframe kf4 = Keyframe.ofInt(0.75f, 100); Keyframe kf3 = Keyframe.ofInt(1f, 500); PropertyValuesHolder pvhRotation = PropertyValuesHolder.ofKeyframe("width", kf0, kf1, kf2, kf4, kf3); ObjectAnimator rotationAnim = ObjectAnimator.ofPropertyValuesHolder(btn2, pvhRotation); rotationAnim.setDuration(2000);
複製程式碼

上述程式碼的意思為:設定btn物件的width屬性值使其:

  • 開始時 Width=400
  • 動畫開始1/4時 Width=200
  • 動畫開始1/2時 Width=400
  • 動畫開始3/4時 Width=100
  • 動畫結束時 Width=500
第一個引數為時間百分比,第二個引數是在第一個引數的時間時的屬性值。定義了一些Keyframe後,通過PropertyValuesHolder類的方法ofKeyframe一個PropertyValuesHolder物件,然後通過ObjectAnimator.ofPropertyValuesHolder獲得一個Animator物件。用下面的程式碼可以實現同樣的效果(上述程式碼時間值是線性,變化均勻):
ObjectAnimator oa=ObjectAnimator.ofInt(btn2, "width", 400,200,400,100,500);
oa.setDuration(2000);
oa.start();

3.9 Animating Views

在View Animation中,對View應用Animation並沒有改變View的屬性,動畫的實現是通過其Parent View實現的,在View被drawn時Parents View改變它的繪製引數,draw後再改變引數invalidate,這樣雖然View的大小或旋轉角度等改變了,但View的實際屬性沒變,所以有效區域還是應用動畫之前的區域,比如你把一按鈕放大兩倍,但還是放大這前的區域可以觸發點選事件。為了改變這一點,在Android 3.0中給View增加了一些引數並對這些引數增加了相應的getter/setter函式(ObjectAnimator要用這些函式改變這些屬性):

  • translationX,translationY: View相對於原始位置的偏移量
  • rotation,rotationX,rotationY: 旋轉,rotation用於2D旋轉角度,3D中用到後兩個
  • scaleX,scaleY: 縮放比
  • x,y: View的最終座標,是View的left,top位置加上translationX,translationY
  • alpha: 透明度
跟位置有關的引數有3個,以X座標為例,可以通過getLeft(),getX(),getTranslateX()獲得,若有一Button btn2,佈局時其座標為(40,0):複製程式碼
//應用動畫之前btn2.getLeft();    //40btn2.getX();    //40btn2.getTranslationX();    //0
//應用translationX動畫ObjectAnimator oa=ObjectAnimator.ofFloat(btn2,"translationX", 200);
oa.setDuration(2000);
oa.start();
/*應用translationX動畫後
btn2.getLeft(); //40
btn2.getX(); //240
btn2.getTranslationX(); //200
*/
//應用X動畫,假設沒有應用之前的translationX動畫ObjectAnimator oa=ObjectAnimator.ofFloat(btn2, "x", 200);
oa.setDuration(2000);
oa.start();
/*應用X動畫後
btn2.getLeft(); //40
btn2.getX(); //200
btn2.getTranslationX(); //160
*/
複製程式碼無論怎樣應用動畫,原來的佈局時的位置通過getLeft()獲得,保持不變;  X是View最終的位置;  translationX為最終位置與佈局時初始位置這差。  所以若就用translationX即為在原來基礎上移動多少,X為最終多少  getX()的值為getLeft()與getTranslationX()的和  對於X動畫,原始碼是這樣的:
case X:
info.mTranslationX = value - mView.mLeft;
break;

Property Animation也可以在XML中定義

  • <set> - AnimatorSet
  • <animator> - ValueAnimator
  • <objectAnimator> - ObjectAnimator
XML檔案應放大/res/animator/中,通過以下方式應用動畫:
AnimatorSet set = (AnimatorSet) AnimatorInflater.loadAnimator(myContext, R.anim.property_animator);
set.setTarget(myObject);
set.start();

3.10 ViewPropertyAnimator

如果需要對一個View的多個屬性進行動畫可以用ViewPropertyAnimator類,該類對多屬性動畫進行了優化,會合並一些invalidate()來減少重新整理檢視,該類在3.1中引入。

以下兩段程式碼實現同樣的效果: 

PropertyValuesHolder pvhX = PropertyValuesHolder.ofFloat("x", 50f);
PropertyValuesHolder pvhY = PropertyValuesHolder.ofFloat("y", 100f);
ObjectAnimator.ofPropertyValuesHolder(myView, pvhX, pvyY).start();
myView.animate().x(50f).y(100f);

相關推薦

Android動畫學習筆記-Android Animation

轉自:http://www.cnblogs.com/angeldevil/archive/2011/12/02/2271096.html3.0以前,android支援兩種動畫模式,tween animation,frame animation,在android3.0中又引入了一個新的動畫系統:property

Android usb學習筆記:Android AOA協議Android端 流程總結

背景 上篇文章中我們瞭解了嵌入式裝置端將Android手機設定為accessory模式的流程以及嵌入式裝置端接收和傳送資料的流程,本文將對應介紹Android端accessory模式被啟用的過程,以及接下來如何與嵌入式裝置端進行通訊。本文的原始碼下載地址:ht

Android 動畫學習(一)之View Animation

Android動畫初步         動畫(Animation)在我們日常的Android開發工作當中使用得較為頻繁,尤其對於Android遊戲這個動畫的集合體,掌握動畫開發的重要性毋庸置疑。同

Android:日常學習筆記(7)———探究UI開發(1)

tac calling repl action its 內容 schema lesson try Android:日常學習筆記(7)———探究UI開發(1) 常用控件的使用方法 TextView 說明:TextView是安卓中最為簡單的一個控件,常用來在界面上顯示一段文本信

Android:日常學習筆記(7)———探究UI開發(4)

this 活動 eal enc panel .html http 中間 編寫 Android:日常學習筆記(7)———探究UI開發(4) UI概述 View 和 ViewGrou   Android 應用中的所有用戶界面元素都是使用 View 和 ViewGroup 對象

Android:日常學習筆記(9)———探究廣播機制

ora rri enabled cas 管理 encoding protect 其他 acc Android:日常學習筆記(9)———探究廣播機制 引入廣播機制 Andorid廣播機制   廣播是任何應用均可接收的消息。系統將針對系統事件(例如:系統啟動或設備開始充電時)傳

Android:日常學習筆記(10)———使用LitePal操作數據庫

分享 數據 turn find netstat price 彈出 category 模式 Android:日常學習筆記(10)———使用LitePal操作數據庫 引入LitePal 什麽是LitePal   LitePal是一款開源的Android數據庫框架,采用了對象關系

Android動畫效果之Frame Animation(逐幀動畫

想要 顯示 star 載體 rop 復雜 ide sources post 前言: 上一篇介紹了Android的Tween Animation(補間動畫) Android動畫效果之Tween Animation(補間動畫),今天來總結下Android的另外一種動

React-Native 學習筆記-Android開發平臺-開發環境搭建

環境變量 最新版 下載 and 系統 系統環境變量 新版本 開發環境 studio 詳細步驟請查看官網對應文檔,BUT,有些註意事項請註意! 1,優先安裝Node.js,因為後面可以使用npm安裝軟件, 2,註意不要使用CNPM!!!!!!!!! 3,Android

Android核心學習筆記

0、android系統啟動 《Android系統啟動流程 -- bootloader》 《The Android boot process from power on》 《Android 啟動過程介紹》 《Android培訓班(86)核心執行之前的載入程式》 這是一系列

學習筆記-Android客戶端獲取IP地址

Android獲取Ip的一些方法,在我們開發中,有判斷手機是否聯網,或者想獲得當前手機的Ip地址,當然WIFI連線的和 3G卡的Ip地址當然是不一樣的. 以這種方法不可取! 首先我嘗試瞭如下方法: WifiManager wifiMana

Android ToolBar學習筆記

前言 開發中經常遇到頂部導航欄的需求,5.0 之後Google為了統一設計風格,默認了ToolBar這個控制元件作為統一頂部欄,並且還支援了不少的動畫和各種設定,但是!有關ToolBar 的theme,Menu,click有不少的坑,今天來系統的學習一下。 內容 基於需求來學習。

Android安全學習筆記1——鎖屏密碼方式

前言 在Android安全學習中,我接觸到第一個例子是鎖屏密碼。我們日常使用手機的時候使用最多的鎖屏密碼是怎麼構成的?下面分享一下我接觸到的知識。 鎖屏密碼的思考 為了安全,Android裝置在解鎖螢幕時會有密碼輸入,那麼在這個密碼存放在哪裡?是否為明文儲存?如果是加密儲存,

Android開發學習筆記(十二)基礎UI控制元件之ImageView、CheckBox、RadioButton

一、ImageView:直接繼承自View,它的作用是在介面上顯示Drawable物件。 ImageView在佈局檔案(如main_activity.xml)中常用的屬性 有 scaleType ,s

Android開發學習筆記(十四)基礎UI控制元件之Spinner

Spinner:彈出一個列表選擇框,供使用者選擇。繼承自ViewGroup,因為可以容納很多列表項,因此它也是一個容器控制元件。 給Spinner指定資料來源的2種方法: 一、通過指定xml檔案來指

Android開發學習筆記(十五)基礎UI控制元件之ListView

一、ListView常用XML屬性: android:choiceMode="" 設定ListView的選擇行為 android:divider="" 設定List列表項的分隔條(即可用顏

Android開發學習筆記(十六)基礎UI控制元件之ListView-SimpleAdapter

一、ListView控制元件: <ListView android:id="@+id/list_view_demo" android:layout_width="match_pa

android 註解學習筆記二: 元註解和自定義註解

首先看一個自定義的註解: 1、自定義註解 public @interface MyAnnotation { int age(); } 可見定義一個註解非常簡單,只需要使用@interface關鍵字來定義即可。 同時我們可以看到,註解的內部可以定義變

Android原始碼學習筆記:Context、ActivityThread和Activity的生命週期

總結: ①在應用啟動的時候,首先會建立一個程序process,然後建立ActivityThread這個物件。 ②根據我們之前學習的Handler,可以知道,在ActivityThread的main方法中,會建立一個Looper和MessageQueue物件。 ③在建

Android開發學習筆記(二)之啟動另外一個Activity

1、Activity 是SDK中的一個類,負責建立一個螢幕視窗,放置UI元件,供使用者互動。 2、建立一個Activity: 1)建立Activity的java類檔案 2)在AndroidManifest.xml中註冊 3)設定佈局檔案 3、AndroidManif