動畫資源 一、分類: (一)、概要: 動畫資源 一、分類: 3.0以前,android支持兩種動畫模式,補間動畫(tween animation),幀動畫(frame animation),在android3.0中又引入了一個新的動畫系統:屬性動畫(property animation)。 這三種動 ...
動畫資源
一、分類:
(一)、概要:
3.0以前,android支持兩種動畫模式,補間動畫(tween animation),幀動畫(frame animation),在android3.0中又引入了一個新的動畫系統:屬性動畫(property animation)。
這三種動畫模式在SDK中被稱為view animation,drawable animation,property animation。
(二)、動畫資源分類:- 屬性動畫:Property Animation
- 幀動畫:Frame Animation (Drawable Animation)
- 補間動畫:Tween Animation (View Animation)
- 透明度補間動畫
- 縮放補間動畫
- 旋轉補間動畫
- 移動補間動畫
publicclass MainActivity extends Activity {(二)、用java代碼實現補間動畫:
private ImageView imageView_main;
private Animation animation = null;
@Override
protectedvoid onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
imageView_main = (ImageView) findViewById(R.id.imageView_main);
}
publicvoid clickButton(View view) {
switch (view.getId()) {
case R.id.button_main_alpha:
animation = new AlphaAnimation(0.0f, 1.0f);
break;
case R.id.button_main_scale:
animation = new ScaleAnimation(0.0f, 1.0f, 0.0f, 1.0f,
Animation.RELATIVE_TO_SELF, 0.5f,
Animation.RELATIVE_TO_SELF, 1.0f);
break;
case R.id.button_main_translate:
animation = new TranslateAnimation(0, 150, 0, 0);
break;
case R.id.button_main_rotate:
animation = new RotateAnimation(0, 360, Animation.RELATIVE_TO_SELF,
0.5f, Animation.RELATIVE_TO_SELF, 1.0f);
break;
default:
break;
}
animation.setDuration(3000);
imageView_main.setAnimation(animation);
}
}
publicclass MainActivity extends Activity {三、幀動畫: Frame Animation(AnimationDrawable對象):幀動畫,就像GIF圖片,通過一系列Drawable依次顯示來模擬動畫的效果。 必須以<animation-list>為根元素,以<item>表示要輪換顯示的圖片,duration屬性表示各項顯示的時間。XML文件要放在/res/anim/或者/res/animator目錄下。 (一)、實例代碼:
private ImageView imageView_main;
private Animation animation = null;
@Override
protectedvoid onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
imageView_main = (ImageView) findViewById(R.id.imageView_main);
}
publicvoid clickButton(View view) {
switch (view.getId()) {
case R.id.button_main_alpha:
animation = new AlphaAnimation(0.0f, 1.0f);
break;
case R.id.button_main_scale:
animation = new ScaleAnimation(0.0f, 1.0f, 0.0f, 1.0f,
Animation.RELATIVE_TO_SELF, 0.5f,
Animation.RELATIVE_TO_SELF, 1.0f);
break;
case R.id.button_main_translate:
animation = new TranslateAnimation(0, 150, 0, 0);
break;
case R.id.button_main_rotate:
animation = new RotateAnimation(0, 360, Animation.RELATIVE_TO_SELF,
0.5f, Animation.RELATIVE_TO_SELF, 1.0f);
break;
default:
break;
}
animation.setDuration(3000);
imageView_main.setAnimation(animation);
}
}
一、res/anim/frame_animation.xml的代碼:
<animation-listxmlns:android="http://schemas.android.com/apk/res/android"
android:oneshot="true">
<itemandroid:drawable="@drawable/anim1"android:duration="50"/>
<itemandroid:drawable="@drawable/anim2"android:duration="50"/>
<itemandroid:drawable="@drawable/anim3"android:duration="50"/>
<itemandroid:drawable="@drawable/anim4"android:duration="50"/>
<itemandroid:drawable="@drawable/anim5"android:duration="50"/>
<itemandroid:drawable="@drawable/anim6"android:duration="50"/>
<itemandroid:drawable="@drawable/anim7"android:duration="50"/>
<itemandroid:drawable="@drawable/anim8"android:duration="50"/>
<itemandroid:drawable="@drawable/anim9"android:duration="50"/>
<itemandroid:drawable="@drawable/anim10"android:duration="50"/>
<itemandroid:drawable="@drawable/anim11"android:duration="50"/>
<itemandroid:drawable="@drawable/anim12"android:duration="50"/>
</animation-list>
二、MainActivity.java代碼:
public class MainActivity extends Activity {
private ImageView imageView_main_show;
private AnimationDrawable animationDrawable = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
imageView_main_show = (ImageView) findViewById(R.id.imageView_main_show);
imageView_main_show.setBackgroundResource(R.anim.frame_animation);
animationDrawable = (AnimationDrawable) imageView_main_show.getBackground();
}
public void clickButton(View view) {
switch (view.getId()) {
case R.id.button_main_start:
if (!animationDrawable.isRunning()) {
//一組動畫是否只播放一次
animationDrawable.setOneShot(false);
animationDrawable.start();
}
break;
case R.id.button_main_stop:
if (animationDrawable.isRunning()) {
animationDrawable.stop();
}
break;
}
}
@Override
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
if (!animationDrawable.isRunning()) {
animationDrawable.setOneShot(false);
animationDrawable.start();
}
}
}
【備註:】 SDK中提到,不要在onCreate()中調用start(),因為AnimationDrawable還沒有完全跟Window相關聯,如果想要界面顯示時就開始動畫的話,可以在onWindowFoucsChanged()中調用start()。 四、屬性動畫: (一)、概念: 屬性動畫,這個是在Android 3.0中才引進的。Property Animation故名思議就是通過動畫的方式改變對象的屬性.屬性動畫更改的是對象的實際屬性,在View Animation(Tween Animation)中,其改變的是View的繪製效果,真正的View的屬性保持不變。 比如無論如何縮放Button的大小,Button的有效點擊區域還是沒有應用動畫時的區域,其位置與大小都不變。而在Property Animation中,改變的是對象的實際屬性,如Button的縮放,Button的位置與大小屬性值都改變了。 Property Animation不止可以應用於View,還可以應用於任何對象。Property Animation只是表示一個值在一段時間內的改變,當值改變時要做什麼事情完全是你自己決定的。 (二)、常用屬性:
- Duration動畫的持續時間,預設300ms。
- Time interpolation:時間插值。LinearInterpolator、AccelerateDecelerateInterpolator,定義動畫的變化率。
- Repeat count and behavior:重覆次數、以及重覆模式;可以定義重覆多少次;重覆時從頭開始,還是反向。
- Animator sets: 動畫集合,你可以定義一組動畫,一起執行或者順序執行。
- Frame refresh delay:幀刷新延遲,對於你的動畫,多久刷新一次幀;預設為10ms,但最終依賴系統的當前狀態;基本不用管。
- ObjectAnimator 動畫的執行類
- ValueAnimator 動畫的執行類
- AnimatorSet 用於控制一組動畫的執行:線性,一起,每個動畫的先後執行等。
- AnimatorInflater 用戶載入屬性動畫的xml文件
- TypeEvaluator 類型估值,主要用於設置動畫操作屬性的值。
- TimeInterpolator 時間插值
- 總的來說,屬性動畫就是,動畫的執行類來設置動畫操作的對象的屬性、持續時間,開始和結束的屬性值,時間差值等,然後系統會根據設置的參數動態的變化對象的屬性。
一、res/anim/property_anim.xml的代碼:
<setxmlns:android="http://schemas.android.com/apk/res/android"
android:ordering="sequentially">
<objectAnimator
android:duration="4000"
android:propertyName="x"
android:valueTo="300"
android:valueType="intType"/>
<objectAnimator
android:duration="4000"
android:propertyName="y"
android:valueTo="400"
android:valueType="intType"/>
<objectAnimator
android:duration="4000"
android:propertyName="x"
android:valueTo="0"
android:valueType="intType"/>
<objectAnimator
android:duration="4000"
android:propertyName="y"
android:valueTo="0"
android:valueType="intType"/>
</set>
二、MainActivity.java代碼:
publicclass MainActivity extends Activity {
private ImageView imageView_main_obj;
private Move move;
@Override
publicvoid onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
imageView_main_obj = (ImageView) findViewById(R.id.imageView_main_obj);
move = new Move();
imageView_main_obj.setOnClickListener(new OnClickListener() {
@Override
publicvoid onClick(View v) {
setTitle(move.getX() + ":" + move.getY());
}
});
}
class Move {
privateinty;
privateintx;
publicint getY() {
returny;
}
publicvoid setY(int y) {
this.y = y;
imageView_main_obj.layout(imageView_main_obj.getLeft(), y,
imageView_main_obj.getRight(),
y + imageView_main_obj.getMeasuredHeight());
}
publicint getX() {
returnx;
}
publicvoid setX(int x) {
this.x = x;
imageView_main_obj.layout(x, imageView_main_obj.getTop(), x
+ imageView_main_obj.getMeasuredWidth(),
imageView_main_obj.getBottom());
}
}
publicvoid clickButton(View view) {
// 裝載屬性動畫資源
AnimatorSet set = (AnimatorSet) AnimatorInflater.loadAnimator(this,
R.animator.property_anim);
// 設置要控制的對象
set.setTarget(move);
// 開始動畫
set.start();
}
}
【備註說明:】
<objectAnimator
android:duration="4000"
android:propertyName="x"
android:valueTo="300"
android:valueType="intType"/>
【備註:】- android:ordering說明一系列動畫動作的執行順序,有兩個選擇: sequentially 和together,順序執行還是一起執行;
- objectAnimator 是設定動畫實施的對象;
- duration是該動畫動作執行從開始到結束所用的時間;
- android:repeatCount="infinite" 可以是整數或者infinite
- android:repeatMode="restart" 可以是restart 或者 reverse
- android:valueFrom=" " 整數|浮點數|顏色