android學習筆記(九)——動畫效果的實現1tween動畫

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動畫的實現就介紹完畢了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章