Android動畫之漸變動畫(Tween Animation)詳解 (漸變、縮放、位移、旋轉(zhuǎn))
本文實例講述了Android動畫之漸變動畫(Tween Animation)。分享給大家供大家參考,具體如下:
Android 平臺提供了兩類動畫。 一類是Tween動畫,就是對場景里的對象不斷的進行圖像變化來產(chǎn)生動畫效果(旋轉(zhuǎn)、平移、放縮和漸變)。
第二類就是 Frame動畫,即順序的播放事先做好的圖像,與gif圖片原理類似。
下面就講一下Tweene Animations。
主要類:
Animation 動畫
AlphaAnimation 漸變透明度
RotateAnimation 畫面旋轉(zhuǎn)
ScaleAnimation 漸變尺寸縮放
TranslateAnimation 位置移動
AnimationSet 動畫集
有了這些類,那么我們?nèi)绾蝸韺崿F(xiàn)動畫效果呢?
以自定義View為例,該View很簡單,畫面上只有一個圖片。 現(xiàn)在我們要對整個View分別實現(xiàn)各種Tween動畫效果。
AlphaAnimation
通過代碼實現(xiàn) AlphaAnimation,如下:
//初始化 Animation alphaAnimation = new AlphaAnimation(0.1f, 1.0f); //設(shè)置動畫時間 alphaAnimation.setDuration(3000); this.startAnimation(alphaAnimation);
其中AlphaAnimation類第一個參數(shù)fromAlpha表示動畫起始時的透明度, 第二個參數(shù)toAlpha表示動畫結(jié)束時的透明度。
setDuration用來設(shè)置動畫持續(xù)時間。
RotateAnimation
代碼:
Animation rotateAnimation = new RotateAnimation(0f, 360f); rotateAnimation.setDuration(1000); this.startAnimation(rotateAnimation);
其中RotateAnimation類第一個參數(shù)fromDegrees表示動畫起始時的角度, 第二個參數(shù)toDegrees表示動畫結(jié)束時的角度。
另外還可以設(shè)置伸縮模式pivotXType、pivotYType, 伸縮動畫相對于x,y 坐標的開始位置pivotXValue、pivotYValue等。
ScaleAnimation
代碼:
//初始化 Animation scaleAnimation = new ScaleAnimation(0.1f, 1.0f,0.1f,1.0f); //設(shè)置動畫時間 scaleAnimation.setDuration(500); this.startAnimation(scaleAnimation);
ScaleAnimation類中
第一個參數(shù)fromX ,第二個參數(shù)toX:分別是動畫起始、結(jié)束時X坐標上的伸縮尺寸。
第三個參數(shù)fromY ,第四個參數(shù)toY:分別是動畫起始、結(jié)束時Y坐標上的伸縮尺寸。
另外還可以設(shè)置伸縮模式pivotXType、pivotYType, 伸縮動畫相對于x,y 坐標的開始位置pivotXValue、pivotYValue等。
TranslateAnimation
代碼:
//初始化 Animation translateAnimation = new TranslateAnimation(0.1f, 100.0f,0.1f,100.0f); //設(shè)置動畫時間 translateAnimation.setDuration(1000); this.startAnimation(translateAnimation);
TranslateAnimation類
第一個參數(shù)fromXDelta ,第二個參數(shù)toXDelta:分別是動畫起始、結(jié)束時X坐標。
第三個參數(shù)fromYDelta ,第四個參數(shù)toYDelta:分別是動畫起始、結(jié)束時Y坐標。
參數(shù)詳細說明:
|
表二 |
||
| XML節(jié)點 | 功能說明 | |
| alpha | 漸變透明度動畫效果 | |
| <alpha android:fromAlpha=”0.1″ android:toAlpha=”1.0″ android:duration=”3000″ /> |
||
| fromAlpha |
屬性為動畫起始時透明度 |
0.0表示完全透明 1.0表示完全不透明 以上值取0.0-1.0之間的float數(shù)據(jù)類型的數(shù)字 |
| toAlpha | 屬性為動畫結(jié)束時透明度 | |
|
表三 |
|||
| 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表示收縮到?jīng)]有 1.0表示正常無伸縮 值小于1.0表示收縮 值大于1.0表示放大 |
|
| toXScale [float] toYScale[float] |
為動畫結(jié)束時,X、Y坐標上的伸縮尺寸 | ||
| pivotX[float] pivotY[float] |
為動畫相對于物件的X、Y坐標的開始位置 | 屬性值說明:從0%-100%中取值,50%為物件的X或Y方向坐標上的中點位置 | |
|
表四 |
|||
| translate | 畫面轉(zhuǎn)換位置移動動畫效果 | ||
| <translate android:fromXDelta=”30″ android:toXDelta=”-80″ android:fromYDelta=”30″ android:toYDelta=”300″ android:duration=”2000″ /> |
|||
| fromXDelta toXDelta |
為動畫、結(jié)束起始時 X坐標上的位置 | ||
| fromYDelta toYDelta |
為動畫、結(jié)束起始時 Y坐標上的位置 | ||
|
表五 |
|||
| rotate | 畫面轉(zhuǎn)移旋轉(zhuǎn)動畫效果 | ||
| <rotate android:interpolator=”@android:anim/accelerate_decelerate_interpolator” android:fromDegrees=”0″ android:toDegrees=”+350″ android:pivotX=”50%” android:pivotY=”50%” android:duration=”3000″ /> |
|||
| fromDegrees | 為動畫起始時物件的角度 | 說明 當角度為負數(shù)——表示逆時針旋轉(zhuǎn) 當角度為正數(shù)——表示順時針旋轉(zhuǎn) (負數(shù)from——to正數(shù):順時針旋轉(zhuǎn)) (負數(shù)from——to負數(shù):逆時針旋轉(zhuǎn)) (正數(shù)from——to正數(shù):順時針旋轉(zhuǎn)) (正數(shù)from——to負數(shù):逆時針旋轉(zhuǎn)) |
|
| toDegrees | 屬性為動畫結(jié)束時物件旋轉(zhuǎn)的角度 可以大于360度 | ||
| pivotX pivotY |
為動畫相對于物件的X、Y坐標的開始位 | 說明:以上兩個屬性值 從0%-100%中取值 50%為物件的X或Y方向坐標上的中點位置 |
|
答案是 AnimationSet。
初看整個類名,還以為只是用來存放 Animation的一個Set, 細看才發(fā)現(xiàn),該類也是繼承自 Animation的。
下面我們實現(xiàn)一個動畫,該動畫會讓圖片移動的同時,圖片透明度漸變,直接看代碼吧。
//初始化 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); //設(shè)置動畫時間 (作用到每個動畫) 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動畫 - 畫面旋轉(zhuǎn)
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);
//設(shè)置動畫時間
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);
//設(shè)置動畫時間
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);
//設(shè)置動畫時間
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);
//設(shè)置動畫時間 (作用到每個動畫)
set.setDuration(1000);
this.startAnimation(set);
break;
default:
break;
}
return true;
}
}
在Activity中調(diào)用該類時,需要注意一定setFocusable(true), 否則焦點在Activity上的話,onKeyUp方法是不會生效的。
調(diào)用該View的代碼:
TweenAnim anim = new TweenAnim(Lesson_11.this); anim.setFocusable(true); setContentView(anim);
上面通過Java代碼,實現(xiàn)了4中不同的Tween動畫,其實在Android中完全可以通過 XML文件來實現(xiàn)動畫。這種方式可能更加簡潔、清晰,也更利于重用。
下面我們分別對這幾種動畫改用xml來實現(xiàn)。
首先是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>
布局文件都已經(jīng)寫完,那么如何來使用這些文件呢?
其實也很簡單,此時需要用到AnimationUtils類。 通過該類中 loadAnimation 方法來加載這些布局文件。
如:
這次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動畫 - 畫面旋轉(zhuǎn)
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);
//設(shè)置動畫時間 (作用到每個動畫)
set.setDuration(1000);
this.startAnimation(set);
break;
default:
break;
}
return true;
}
}
希望本文所述對大家Android程序設(shè)計有所幫助。
相關(guān)文章
Android異常 java.lang.IllegalStateException解決方法
這篇文章主要介紹了Android異常 java.lang.IllegalStateException解決方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-11-11
Android 中使用EditText 點擊全選再次點擊取消全選功能
這篇文章主要介紹了Android 中使用EditText 點擊全選再次點擊取消全選功能,非常不錯,具有參考借鑒價值,需要的朋友參考下吧2016-12-12
Android Studio打包APK文件具體實現(xiàn)步驟解析
這篇文章主要介紹了Android Studio打包APK文件具體實現(xiàn)步驟解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-11-11
Android使用Canvas?2D實現(xiàn)循環(huán)菜單效果
循環(huán)菜單有很多種自定義方式,我們可以利用ViewPager或者RecyclerView?+?CarouselLayoutManager?或者RecyclerView?+?PageSnapHelper來實現(xiàn)這種效果,今天我們使用Canvas?2D來實現(xiàn)這種效果,感興趣的朋友可以參考下2024-01-01
Android控件之SlidingDrawer(滑動式抽屜)詳解與實例分享
這篇文章詳細介紹了Android控件之SlidingDrawer(滑動式抽屜)與實例,有需要的朋友可以參考一下2013-10-10
詳解Xamarin.Android 利用Fragment實現(xiàn)底部菜單
這篇文章主要介紹了詳解Xamarin.Android 利用Fragment實現(xiàn)底部菜單,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-02-02
在android開發(fā)中盡量不要使用中文路徑的問題詳解
本篇文章對在android開發(fā)中盡量不要使用中文路徑的問題進行了詳細的分析介紹。需要的朋友參考下2013-05-05
Android穩(wěn)定性:可遠程配置化的Looper兜底框架
這篇文章主要為大家介紹了Android穩(wěn)定性可遠程配置化的Looper兜底框架實例實例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-02-02
Android源碼學(xué)習(xí)之觀察者模式應(yīng)用及優(yōu)點介紹
定義對象間一種一對多的依賴關(guān)系,使得當一個對象改變狀態(tài),則所有依賴于它的對象都會得到通知并被自動更新等等,需要了解的朋友可以參考下2013-01-01

