android学习笔记(九)——动画效果的实现1tween动画

来源:互联网 发布:任子行网络监测接入器 编辑:程序博客网 时间:2024/06/07 00:55

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

0 0
原创粉丝点击