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动画的实现就介绍完毕了

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