android提供了兩種動畫的實現方式,一種是tween動畫,而另一種則是onframe動畫,今天先來介紹一下tween動畫:
一,通過java代碼來實現
android提供了一個animation類和一個animationset類,即動畫類和動畫集類,這個就是實現tween動畫的基礎,實現首先是定義一個animation類,給其賦予動畫動作,之後start即可,需要注意的是需要放到view類裏面實現,而不是在Activity中,動畫類提供了幾種基本動作,透明度變化,平移,旋轉,縮放,下面就來介紹一下,這4種基本動作的實現
1.透明度變化,alphaAnimation的第一個參數是初始透明度,第二個是動畫結束時的透明度,setDuration函數是用來設置動畫的播放時間,即從初始透明度變化到結束時透明度的所需時間
alphaAnimation = new AlphaAnimation(0.1f, 1.0f);
//設置動畫時間
alphaAnimation.setDuration(10000);
this.startAnimation(alphaAnimation);
2.平移變化,第一個參數爲起始X座標,第二個結束x座標,第三個參數爲起始y座標,第四個結束y座標,都是相對於左上角來看的座標
translateAnimation = new TranslateAnimation(0.1f, 100.0f,0.1f,100.0f);
//設置動畫時間
translateAnimation.setDuration(10000);
this.startAnimation(translateAnimation);
3.縮放變化,第一個參數爲初始x軸的縮放率,第二個參數爲結束時x軸縮放比率,三,四參數與一二參數一致,對應Y軸,這裏的縮放率可以看成從0.1倍大小放大到1倍大小
scaleAnimation = new ScaleAnimation(0.1f, 1.0f,0.1f,1.0f);
flag="left";
//設置動畫時間
scaleAnimation.setDuration(10000);
this.startAnimation(scaleAnimation);
4.旋轉變化,第一個參數爲初始角度,第二個參數爲結束時角度,都是相對於圖片左上角來看的
rotateAnimation = new RotateAnimation(0f, 360f);
flag="down";
rotateAnimation.setDuration(10000);
this.startAnimation(rotateAnimation);
5.組合動畫,之前提過了AnimationSet類,這個類可以將多個Animation類組合到一起同時播放,實現過程如下,通過addAnimation將動畫載入到動畫集中,然後開始播放動畫集,從而實現組合動畫效果
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);
下面是一個View類的實現代碼,需要注意的是在Activity中的調用方式,一定要注意的是設置焦點爲true,否則view類中的按鍵是沒辦法響應的,因爲此時按鍵響應是在Activity上的
myView view=new myView(this);
view.setFocusable(true);
setContentView(view);
package com.example.netdemo;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.drawable.BitmapDrawable;
import android.os.Bundle;
import android.util.Log;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.MenuItem;
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;
import android.widget.Toast;
public class Get extends Activity {
private static final String tag="paint";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
myView view=new myView(this);
view.setFocusable(true);
setContentView(view);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.get, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
public class myView extends View{
private String flag="";
public myView(Context context) {
super(context);
// TODO Auto-generated constructor stub
}
public void onDraw(Canvas canva){
Paint mPaint=new Paint();
//設置paint爲無鋸齒
mPaint.setAntiAlias(true);
//設置paint顏色
mPaint.setColor(Color.RED);
mPaint.setTextSize(14);
//設置空心外框的寬度
mPaint.setStrokeWidth(5);
Log.i(tag,"paint的顏色: "+mPaint.getColor());
Log.i(tag,"paint的Alpha: "+mPaint.getAlpha());
Log.i(tag,"paint的外框寬度: "+mPaint.getStrokeWidth());
Log.i(tag,"paint的字體尺寸: "+mPaint.getTextSize());
/*//繪製一個矩形
canva.drawRect((320-80)/2,20,(320-80)/2+80,20+40,mPaint);
//設置風格爲實心
mPaint.setStyle(Paint.Style.FILL);
mPaint.setColor(Color.GREEN);
//繪製綠色實心矩形
canva.drawRect(0,20,40,20+40,mPaint);
//畫圖像
Bitmap mbitmap = ((BitmapDrawable)getResources().getDrawable(R.drawable.pic1)).getBitmap();
Log.i(tag,"圖像的寬度: "+mbitmap.getWidth());
Log.i(tag,"圖像的寬度: "+mbitmap.getHeight());
Log.i(tag,"mutable屬性: "+mbitmap.isMutable());
int h=mbitmap.getHeight();
int w=mbitmap.getWidth();
//獲取配置信息
try{
mbitmap.setHeight(h/4);
mbitmap.setWidth(w/4);
Log.i(tag,"圖像的寬度: "+mbitmap.getWidth());
Log.i(tag,"圖像的寬度: "+mbitmap.getHeight());
}catch(Exception e){
Log.i(tag,"錯誤爲: "+e.getMessage());
}*/
//將mutable屬性化爲true,讓圖片可變
Bitmap mbitmap = ((BitmapDrawable)getResources().getDrawable(R.drawable.pic1)).getBitmap();
Log.i(tag,"圖像的寬度: "+mbitmap.getWidth());
Log.i(tag,"圖像的寬度: "+mbitmap.getHeight());
Log.i(tag,"mutable屬性: "+mbitmap.isMutable());
int h=mbitmap.getHeight();
int w=mbitmap.getWidth();
Bitmap mbitmap1=BitmapFactory.decodeResource(getResources(), R.drawable.pic1).copy(Bitmap.Config.ARGB_8888, true);
Log.i(tag,"mutable屬性: "+mbitmap1.isMutable());
try{
mbitmap1.setHeight(h/4);
mbitmap1.setWidth(w/4);
Log.i(tag,"圖像的寬度: "+mbitmap1.getWidth());
Log.i(tag,"圖像的寬度: "+mbitmap1.getHeight());
}catch(Exception e){
Log.i(tag,"錯誤爲: "+e.getMessage());
}
//matrix縮放
Matrix mMatrix=new Matrix();
mMatrix.reset();
mMatrix.setScale(0.2f,0.2f);
Bitmap mbitmap2=Bitmap.createBitmap(mbitmap,0,0,w,h,mMatrix,true);
canva.drawBitmap(mbitmap2,40, 50,null);
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
// TODO Auto-generated method stub
Log.i(tag,"on key down");
return true;
}
@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
// TODO Auto-generated method stub
//透明度漸變
Animation alphaAnimation=null;
//旋轉動畫
Animation rotateAnimation=null;
//縮放動畫
Animation scaleAnimation=null;
//位置移動
Animation translateAnimation=null;
Log.i("Tween", "onKeyDown");
switch(keyCode){
case KeyEvent.KEYCODE_DPAD_UP:
Log.i("Tween", "onKeyDown - KEYCODE_DPAD_UP");
flag="up";
alphaAnimation = new AlphaAnimation(0.1f, 1.0f);
//設置動畫時間
alphaAnimation.setDuration(10000);
this.startAnimation(alphaAnimation);
break;
case KeyEvent.KEYCODE_DPAD_DOWN:
Log.i("Tween", "onKeyDown - KEYCODE_DPAD_DOWN");
rotateAnimation = new RotateAnimation(0f, 360f);
flag="down";
rotateAnimation.setDuration(10000);
this.startAnimation(rotateAnimation);
break;
case KeyEvent.KEYCODE_DPAD_LEFT:
Log.i("Tween", "onKeyDown - KEYCODE_DPAD_LEFT");
//初始化
scaleAnimation = new ScaleAnimation(0.1f, 1.0f,0.1f,1.0f);
flag="left";
//設置動畫時間
scaleAnimation.setDuration(10000);
this.startAnimation(scaleAnimation);
break;
case KeyEvent.KEYCODE_DPAD_RIGHT:
Log.i("Tween", "onKeyDown - KEYCODE_DPAD_RIGHT");
flag="right";
//初始化
translateAnimation = new TranslateAnimation(20.0f, 100.0f,20.0f,100.0f);
//設置動畫時間
translateAnimation.setDuration(10000);
this.startAnimation(translateAnimation);
break;
case KeyEvent.KEYCODE_DPAD_CENTER:
flag="center";
Log.i("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(10000);
this.startAnimation(set);
break;
default:
break;
}
return true;
}
@Override
protected void onAnimationEnd() {
// TODO Auto-generated method stub
if(flag=="up"){
Toast.makeText(this.getContext(), flag+"動畫完結", Toast.LENGTH_LONG).show();
}else if(flag=="down"){
Toast.makeText(this.getContext(), flag+"動畫完結", Toast.LENGTH_LONG).show();
}else if(flag=="left"){
Toast.makeText(this.getContext(), flag+"動畫完結", Toast.LENGTH_LONG).show();
}else if(flag=="right"){
Toast.makeText(this.getContext(), flag+"動畫完結", Toast.LENGTH_LONG).show();
}else if(flag=="center"){
Toast.makeText(this.getContext(), flag+"動畫完結", Toast.LENGTH_LONG).show();
}
super.onAnimationEnd();
}
@Override
protected void onAnimationStart() {
// TODO Auto-generated method stub
if(flag=="up"){
Toast.makeText(this.getContext(), flag+"動畫開始", Toast.LENGTH_LONG).show();
}else if(flag=="down"){
Toast.makeText(this.getContext(), flag+"動畫開始", Toast.LENGTH_LONG).show();
}else if(flag=="left"){
Toast.makeText(this.getContext(), flag+"動畫開始", Toast.LENGTH_LONG).show();
}else if(flag=="right"){
Toast.makeText(this.getContext(), flag+"動畫開始", Toast.LENGTH_LONG).show();
}else if(flag=="center"){
Toast.makeText(this.getContext(), flag+"動畫開始", Toast.LENGTH_LONG).show();
}
super.onAnimationStart();
}
}
}
二,通過XML來實現動畫效果
上述動畫不光能用java的代碼來實現,同樣也可以用xml來實現,實現方式稍微有點差別,下面就來介紹一下如何使用xml來實現Tween動畫效果
首先在res下創建anim的文件夾,之後再其中新建xml文件,之後就可以通過AnimationUtils的方法LoadAnimation來載入寫在xml中的動作
1.透明度變化
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<alpha
<!--fromAlpha就是初始透明度,toalpha爲結束時透明度,duration就是動畫播放時間>
android:fromAlpha="0.1"
android:toAlpha="1.0"
android:duration="2000"
/>
</set>
2.縮放變化,參數和之前代碼形式是一樣的
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<scale
android:fromXScale="0.1"
android:toXScale="1.0"
android:fromYScale="0.1"
android:toYScale="1.0"
android:duration="10000"
/>
</set>
3.旋轉變化
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<rotate
android:fromDegrees="0"
android:toDegrees="360"
android:duration="500"
/>
</set>
4.平移變化
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:fromXDelta="1.0"
android:toXDelta="100.0"
android:fromYDelta="1.0"
android:toYDelta="100.0"
android:duration="10000">
</translate>
</set>
5,動畫集,在set中添加標籤rotate,translate,alpha,scale然後完善其參數即可
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:fromXDelta="1.0"
android:toXDelta="100.0"
android:fromYDelta="1.0"
android:toYDelta="100.0"
android:duration="10000">
</translate>
<alpha
android:fromAlpha="0.1"
android:toAlpha="1.0"
android:duration="2000"
/>
</set>
具體的調用方式如下:
//普通單體調用
alphaAnimation=AnimationUtils.loadAnimation(this.getContext(),R.anim.action_alpha);
this.startAnimation(alphaAnimation);
//動畫集調用,返回對象是animation對象需要強制轉換爲動畫集對象
AnimationSet set = (AnimationSet) AnimationUtils.loadAnimation(this.getContext(),R.anim.action_set);
this.startAnimation(set);
這樣TWEEN動畫的實現就介紹完畢了