亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > Android > 正文

Android動畫之漸變動畫(Tween Animation)詳解 (漸變、縮放、位移、旋轉)

2020-04-11 11:03:45
字體:
來源:轉載
供稿:網友

本文實例講述了Android動畫之漸變動畫(Tween Animation)。分享給大家供大家參考,具體如下:

Android 平臺提供了兩類動畫。 一類是Tween動畫,就是對場景里的對象不斷的進行圖像變化來產生動畫效果(旋轉、平移、放縮和漸變)。

第二類就是 Frame動畫,即順序的播放事先做好的圖像,與gif圖片原理類似。

下面就講一下Tweene Animations。

主要類:

Animation                  動畫
AlphaAnimation             漸變透明度
RotateAnimation            畫面旋轉
ScaleAnimation             漸變尺寸縮放
TranslateAnimation         位置移動
AnimationSet               動畫集

有了這些類,那么我們如何來實現動畫效果呢?

以自定義View為例,該View很簡單,畫面上只有一個圖片。 現在我們要對整個View分別實現各種Tween動畫效果。

AlphaAnimation

通過代碼實現 AlphaAnimation,如下:

//初始化Animation alphaAnimation = new AlphaAnimation(0.1f, 1.0f);//設置動畫時間 alphaAnimation.setDuration(3000);this.startAnimation(alphaAnimation);

其中AlphaAnimation類第一個參數fromAlpha表示動畫起始時的透明度, 第二個參數toAlpha表示動畫結束時的透明度。

setDuration用來設置動畫持續時間。

RotateAnimation

代碼:

Animation rotateAnimation = new RotateAnimation(0f, 360f);rotateAnimation.setDuration(1000);this.startAnimation(rotateAnimation);

其中RotateAnimation類第一個參數fromDegrees表示動畫起始時的角度, 第二個參數toDegrees表示動畫結束時的角度。

另外還可以設置伸縮模式pivotXType、pivotYType, 伸縮動畫相對于x,y 坐標的開始位置pivotXValue、pivotYValue等。

ScaleAnimation

代碼:

//初始化Animation scaleAnimation = new ScaleAnimation(0.1f, 1.0f,0.1f,1.0f);//設置動畫時間scaleAnimation.setDuration(500);this.startAnimation(scaleAnimation);

ScaleAnimation類中

第一個參數fromX ,第二個參數toX:分別是動畫起始、結束時X坐標上的伸縮尺寸。
第三個參數fromY ,第四個參數toY:分別是動畫起始、結束時Y坐標上的伸縮尺寸。

另外還可以設置伸縮模式pivotXType、pivotYType, 伸縮動畫相對于x,y 坐標的開始位置pivotXValue、pivotYValue等。

TranslateAnimation

代碼:

//初始化Animation translateAnimation = new TranslateAnimation(0.1f, 100.0f,0.1f,100.0f);//設置動畫時間 translateAnimation.setDuration(1000);this.startAnimation(translateAnimation);

TranslateAnimation類

第一個參數fromXDelta ,第二個參數toXDelta:分別是動畫起始、結束時X坐標。
第三個參數fromYDelta ,第四個參數toYDelta:分別是動畫起始、結束時Y坐標。

參數詳細說明:

表二

XML節點 功能說明
alpha 漸變透明度動畫效果
<alpha
android:fromAlpha=”0.1″
android:toAlpha=”1.0″
android:duration=”3000″ />
fromAlpha

屬性為動畫起始時透明度

0.0表示完全透明
1.0表示完全不透明
以上值取0.0-1.0之間的float數據類型的數字
toAlpha 屬性為動畫結束時透明度

表三

scale 漸變尺寸伸縮動畫效果
<scale
android:interpolator= “@android:anim/accelerate_decelerate_interpolator”
android:fromXScale=”0.0″
android:toXScale=”1.4″
android:fromYScale=”0.0″
android:toYScale=”1.4″
android:pivotX=”50%”
android:pivotY=”50%”
android:fillAfter=”false”
android:startOffset=“700”
android:duration=”700″
android:repeatCount=”10″ />
fromXScale[float] fromYScale[float] 為動畫起始時,X、Y坐標上的伸縮尺寸 0.0表示收縮到沒有
1.0表示正常無伸縮
值小于1.0表示收縮
值大于1.0表示放大
toXScale [float]
toYScale[float]
為動畫結束時,X、Y坐標上的伸縮尺寸
pivotX[float]
pivotY[float]
為動畫相對于物件的X、Y坐標的開始位置 屬性值說明:從0%-100%中取值,50%為物件的X或Y方向坐標上的中點位置
       

表四

translate 畫面轉換位置移動動畫效果
<translate
android:fromXDelta=”30″
android:toXDelta=”-80″
android:fromYDelta=”30″
android:toYDelta=”300″
android:duration=”2000″ />
fromXDelta
toXDelta
為動畫、結束起始時 X坐標上的位置  
fromYDelta
toYDelta
為動畫、結束起始時 Y坐標上的位置  
       

表五

rotate 畫面轉移旋轉動畫效果
<rotate
android:interpolator=”@android:anim/accelerate_decelerate_interpolator”
android:fromDegrees=”0″
android:toDegrees=”+350″
android:pivotX=”50%”
android:pivotY=”50%”
android:duration=”3000″ />
fromDegrees 為動畫起始時物件的角度 說明
當角度為負數――表示逆時針旋轉
當角度為正數――表示順時針旋轉
(負數from――to正數:順時針旋轉)
(負數from――to負數:逆時針旋轉)
(正數from――to正數:順時針旋轉)
(正數from――to負數:逆時針旋轉)
toDegrees 屬性為動畫結束時物件旋轉的角度 可以大于360度
pivotX
pivotY
為動畫相對于物件的X、Y坐標的開始位 說明:以上兩個屬性值 從0%-100%中取值
50%為物件的X或Y方向坐標上的中點位置
       
以上都是單獨的使用某個動畫,那么如何讓多個動畫同時生效呢?

答案是 AnimationSet。

初看整個類名,還以為只是用來存放 Animation的一個Set, 細看才發現,該類也是繼承自 Animation的。

下面我們實現一個動畫,該動畫會讓圖片移動的同時,圖片透明度漸變,直接看代碼吧。

//初始化 Translate動畫translateAnimation = new TranslateAnimation(0.1f, 100.0f,0.1f,100.0f);//初始化 Alpha動畫alphaAnimation = new AlphaAnimation(0.1f, 1.0f);//動畫集AnimationSet set = new AnimationSet(true);set.addAnimation(translateAnimation);set.addAnimation(alphaAnimation);//設置動畫時間 (作用到每個動畫)set.setDuration(1000);this.startAnimation(set);

是不是覺得很簡單呢?

附上整個View類的代碼吧。

package com.yfz.view;import com.yfz.R;import android.content.Context;import android.graphics.Canvas;import android.graphics.drawable.BitmapDrawable;import android.util.Log;import android.view.KeyEvent;import android.view.View;import android.view.animation.AlphaAnimation;import android.view.animation.Animation;import android.view.animation.AnimationSet;import android.view.animation.RotateAnimation;import android.view.animation.ScaleAnimation;import android.view.animation.TranslateAnimation;public class TweenAnim extends View {  //Alpha動畫 - 漸變透明度  private Animation alphaAnimation = null;  //Sacle動畫 - 漸變尺寸縮放  private Animation scaleAnimation = null;  //Translate動畫 - 位置移動  private Animation translateAnimation = null;  //Rotate動畫 - 畫面旋轉  private Animation rotateAnimation = null;  public TweenAnim(Context context) {    super(context);  }  @Override  protected void onDraw(Canvas canvas) {    super.onDraw(canvas);    Log.e("Tween", "onDraw");    //加載一個圖片    canvas.drawBitmap(((BitmapDrawable)getResources().getDrawable(R.drawable.gallery_photo_5)).getBitmap(), 0, 0, null);  }  @Override  public boolean onKeyDown(int keyCode, KeyEvent event) {    Log.e("Tween", "onKeyDown");    return true;  }  @Override  public boolean onKeyUp(int keyCode, KeyEvent event) {    Log.e("Tween", "onKeyDown");    switch (keyCode) {      case KeyEvent.KEYCODE_DPAD_UP:        Log.e("Tween", "onKeyDown - KEYCODE_DPAD_UP");        alphaAnimation = new AlphaAnimation(0.1f, 1.0f);        //設置動畫時間        alphaAnimation.setDuration(3000);        this.startAnimation(alphaAnimation);        break;      case KeyEvent.KEYCODE_DPAD_DOWN:        Log.e("Tween", "onKeyDown - KEYCODE_DPAD_DOWN");        rotateAnimation = new RotateAnimation(0f, 360f);        rotateAnimation.setDuration(1000);        this.startAnimation(rotateAnimation);        break;      case KeyEvent.KEYCODE_DPAD_LEFT:        Log.e("Tween", "onKeyDown - KEYCODE_DPAD_LEFT");        //初始化        scaleAnimation = new ScaleAnimation(0.1f, 1.0f,0.1f,1.0f);        //設置動畫時間        scaleAnimation.setDuration(500);        this.startAnimation(scaleAnimation);        break;      case KeyEvent.KEYCODE_DPAD_RIGHT:        Log.e("Tween", "onKeyDown - KEYCODE_DPAD_RIGHT");        //初始化        translateAnimation = new TranslateAnimation(0.1f, 100.0f,0.1f,100.0f);        //設置動畫時間        translateAnimation.setDuration(1000);        this.startAnimation(translateAnimation);        break;      case KeyEvent.KEYCODE_DPAD_CENTER:        Log.e("Tween", "onKeyDown - KEYCODE_DPAD_CENTER");        //初始化 Translate動畫        translateAnimation = new TranslateAnimation(0.1f, 100.0f,0.1f,100.0f);        //初始化 Alpha動畫        alphaAnimation = new AlphaAnimation(0.1f, 1.0f);        //動畫集        AnimationSet set = new AnimationSet(true);        set.addAnimation(translateAnimation);        set.addAnimation(alphaAnimation);        //設置動畫時間 (作用到每個動畫)        set.setDuration(1000);        this.startAnimation(set);        break;      default:        break;    }    return true;  }}

在Activity中調用該類時,需要注意一定setFocusable(true), 否則焦點在Activity上的話,onKeyUp方法是不會生效的。

調用該View的代碼:

TweenAnim anim = new TweenAnim(Lesson_11.this);anim.setFocusable(true);setContentView(anim);

上面通過Java代碼,實現了4中不同的Tween動畫,其實在Android中完全可以通過 XML文件來實現動畫。這種方式可能更加簡潔、清晰,也更利于重用。
下面我們分別對這幾種動畫改用xml來實現。

首先是AlphaAnimation。

alpha_anim.xml:

<?xml version="1.0" encoding="utf-8"?><set xmlns:android="http://schemas.android.com/apk/res/android">  <alpha    android:fromAlpha="0.1"    android:toAlpha="1.0"    android:duration="2000"  /></set>

不用解釋了吧。

RotateAnimation

rotate_anim.xml:

<?xml version="1.0" encoding="utf-8"?><set xmlns:android="http://schemas.android.com/apk/res/android">  <rotate    android:interpolator="@android:anim/accelerate_decelerate_interpolator"    android:fromDegrees="0"    android:toDegrees="360"    android:pivotX="50%"    android:pivotY="50%"    android:duration="500"  /></set>

ScaleAnimation

scale_anim.xml:

<?xml version="1.0" encoding="utf-8"?><set xmlns:android="http://schemas.android.com/apk/res/android">  <scale    android:interpolator="@android:anim/accelerate_decelerate_interpolator"    android:fromXScale="0.0"    android:toXScale="1.0"    android:fromYScale="0.0"    android:toYScale="1.0"    android:pivotX="50%"    android:pivotY="50%"    android:fillAfter="false"    android:duration="500"  /></set>

TranslateAnimation

translate_anim.xml:

<?xml version="1.0" encoding="utf-8"?><set xmlns:android="http://schemas.android.com/apk/res/android">  <translate    android:fromXDelta="10"    android:toXDelta="100"    android:fromYDelta="10"    android:toYDelta="100"  /></set>

布局文件都已經寫完,那么如何來使用這些文件呢?
其實也很簡單,此時需要用到AnimationUtils類。 通過該類中 loadAnimation 方法來加載這些布局文件。
如:

復制代碼 代碼如下:
rotateAnimation = AnimationUtils.loadAnimation(this.getContext(), R.anim.rotate_anim);

這次View類的代碼如下:

package com.yfz.view;import com.yfz.R;import android.content.Context;import android.graphics.Canvas;import android.graphics.drawable.BitmapDrawable;import android.util.Log;import android.view.KeyEvent;import android.view.View;import android.view.animation.AlphaAnimation;import android.view.animation.Animation;import android.view.animation.AnimationSet;import android.view.animation.AnimationUtils;import android.view.animation.RotateAnimation;import android.view.animation.ScaleAnimation;import android.view.animation.TranslateAnimation;public class TweenAnim2 extends View {  //Alpha動畫 - 漸變透明度  private Animation alphaAnimation = null;  //Sacle動畫 - 漸變尺寸縮放  private Animation scaleAnimation = null;  //Translate動畫 - 位置移動  private Animation translateAnimation = null;  //Rotate動畫 - 畫面旋轉  private Animation rotateAnimation = null;  public TweenAnim2(Context context) {    super(context);  }  @Override  protected void onDraw(Canvas canvas) {    super.onDraw(canvas);    Log.e("Tween", "onDraw");    //加載一個圖片    canvas.drawBitmap(((BitmapDrawable)getResources().getDrawable(R.drawable.gallery_photo_5)).getBitmap(), 0, 0, null);  }  @Override  public boolean onKeyDown(int keyCode, KeyEvent event) {    Log.e("Tween", "onKeyDown");    return true;  }  @Override  public boolean onKeyUp(int keyCode, KeyEvent event) {    Log.e("Tween", "onKeyDown");    switch (keyCode) {      case KeyEvent.KEYCODE_DPAD_UP:        Log.e("Tween", "onKeyDown - KEYCODE_DPAD_UP");        alphaAnimation = AnimationUtils.loadAnimation(this.getContext(), R.anim.alpha_anim);        this.startAnimation(alphaAnimation);        break;      case KeyEvent.KEYCODE_DPAD_DOWN:        Log.e("Tween", "onKeyDown - KEYCODE_DPAD_DOWN");        rotateAnimation = AnimationUtils.loadAnimation(this.getContext(), R.anim.rotate_anim);        this.startAnimation(rotateAnimation);        break;      case KeyEvent.KEYCODE_DPAD_LEFT:        Log.e("Tween", "onKeyDown - KEYCODE_DPAD_LEFT");        scaleAnimation = AnimationUtils.loadAnimation(this.getContext(), R.anim.scale_anim);        this.startAnimation(scaleAnimation);        break;      case KeyEvent.KEYCODE_DPAD_RIGHT:        Log.e("Tween", "onKeyDown - KEYCODE_DPAD_RIGHT");        translateAnimation = AnimationUtils.loadAnimation(this.getContext(), R.anim.translate_anim);        this.startAnimation(translateAnimation);        break;      case KeyEvent.KEYCODE_DPAD_CENTER:        Log.e("Tween", "onKeyDown - KEYCODE_DPAD_CENTER");        //初始化 Translate動畫        translateAnimation = AnimationUtils.loadAnimation(this.getContext(), R.anim.translate_anim);        //初始化 Alpha動畫        alphaAnimation = AnimationUtils.loadAnimation(this.getContext(), R.anim.alpha_anim);        //動畫集        AnimationSet set = new AnimationSet(true);        set.addAnimation(translateAnimation);        set.addAnimation(alphaAnimation);        //設置動畫時間 (作用到每個動畫)        set.setDuration(1000);        this.startAnimation(set);        break;      default:        break;    }    return true;  }}

希望本文所述對大家Android程序設計有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲激情视频在线观看| 亚洲在线观看视频| 国产成人一区二区三区| 欧美夫妻性生活视频| 日韩免费av片在线观看| 国产免费一区视频观看免费| 国内伊人久久久久久网站视频| 欧美一区二区三区免费观看| 日韩中文字幕网址| 国产精品久久久久久久久借妻| 亚洲欧美另类国产| 91精品国产综合久久香蕉的用户体验| 欧美日韩美女视频| 伊人亚洲福利一区二区三区| 欧美性色视频在线| 亚洲久久久久久久久久| 欧美视频一区二区三区…| 91免费看国产| 欧美成aaa人片在线观看蜜臀| 国产精品视频99| 亚洲成人久久一区| 欧美性猛交xxxx乱大交极品| 中文字幕9999| 91久久久久久久久久久久久| www.国产精品一二区| 国产欧美日韩91| 国产精品老女人精品视频| 国产一区二区丝袜| 91av在线精品| 亚洲国内精品视频| 国产欧美在线播放| 国产精品18久久久久久麻辣| 成人精品视频久久久久| 国产精品v片在线观看不卡| 久久精品亚洲94久久精品| 欧美性猛交xxxx偷拍洗澡| 人妖精品videosex性欧美| 中文字幕av一区二区| 欧美日韩国产在线播放| 成人黄色免费在线观看| 成人伊人精品色xxxx视频| 国产精品jvid在线观看蜜臀| 亚洲精品国产suv| 国产69精品99久久久久久宅男| 亚洲成人激情图| 国产亚洲成av人片在线观看桃| 97国产精品久久| 国外成人免费在线播放| 欧美性猛交xxxx乱大交3| 日韩免费av片在线观看| 国产成人精品久久久| 欧美俄罗斯性视频| 亚洲国产精品热久久| 日韩成人在线观看| 91天堂在线视频| 88xx成人精品| 久久久国产精品视频| 亚洲国产成人在线视频| 97久久精品人人澡人人爽缅北| 亚洲精品成人网| 538国产精品视频一区二区| 午夜免费日韩视频| 欧美精品videos另类日本| 亚洲热线99精品视频| 午夜精品一区二区三区视频免费看| 国产成人a亚洲精品| 久久亚洲国产精品| 精品久久久久久中文字幕一区奶水| 欧美精品videosex性欧美| 日韩在线观看免费高清| 日韩中文综合网| 日韩美女免费观看| 国产日韩精品电影| 91亚洲永久免费精品| 色婷婷久久一区二区| 国产伦精品一区二区三区精品视频| 国内精品模特av私拍在线观看| 综合网日日天干夜夜久久| 国产亚洲视频在线观看| 亚洲一区二区三区视频播放| 北条麻妃一区二区三区中文字幕| 另类美女黄大片| 欧美日韩国产二区| 亚洲一区二区久久久久久| 亚洲欧美精品suv| 日韩亚洲精品电影| 亚洲sss综合天堂久久| 国产精品爱久久久久久久| 日韩在线观看免费网站| 国产精品日韩av| 欧美性20hd另类| 最新国产精品拍自在线播放| 国产成+人+综合+亚洲欧美丁香花| 午夜精品一区二区三区在线视频| 中文字幕久久亚洲| 欧美日韩一区免费| 国外日韩电影在线观看| 在线视频免费一区二区| 亚洲一区亚洲二区| 国产成人欧美在线观看| 成人精品视频99在线观看免费| 色七七影院综合| 欧美成人免费一级人片100| 日韩欧美国产激情| 91理论片午午论夜理片久久| 色婷婷**av毛片一区| 国产精品女主播视频| 亚洲丝袜在线视频| 亚洲国内高清视频| 91在线观看免费网站| 日韩成人黄色av| 国产午夜精品理论片a级探花| 中文字幕国产精品| 久久久久久久久久久免费精品| 亚洲成在人线av| 成人av.网址在线网站| 这里只有精品久久| 欧美资源在线观看| 亚洲精品福利免费在线观看| 亚洲精品电影网站| 日韩电影免费在线观看| 欧美日韩国产第一页| 欧美裸体xxxx极品少妇软件| 91高清免费视频| 91精品视频专区| 久久香蕉国产线看观看网| 韩国三级日本三级少妇99| 成年人精品视频| 欧美在线观看网站| 久久91亚洲人成电影网站| 久久这里只有精品99| 精品久久香蕉国产线看观看gif| 欧美日韩高清在线观看| 欧美亚洲另类制服自拍| 亚洲欧洲xxxx| 亚洲国产精品嫩草影院久久| 久久久女人电视剧免费播放下载| 成人福利在线观看| 亚洲第一福利在线观看| 国产精品九九九| 一区二区三欧美| 欧美一级免费看| 日本成人精品在线| 国产精品久在线观看| 国产一区二区在线免费视频| 欧美日韩另类视频| 91美女福利视频高清| 热99在线视频| 久久偷看各类女兵18女厕嘘嘘| 日韩免费观看av| 精品视频久久久久久| 久久精品电影网站| 成人做爰www免费看视频网站| 久久五月情影视| 国产网站欧美日韩免费精品在线观看| 久久影视三级福利片| 最近2019中文字幕第三页视频| 91视频国产高清| 日韩精品高清在线观看| 欧美性猛交xxxx黑人| 日本不卡视频在线播放| 色妞一区二区三区| 国产一区二区动漫| 91欧美精品成人综合在线观看|