您的位置:首页 > 移动开发 > Android开发

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

2015-07-05 09:12 666 查看
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" e
c86d
ncoding="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动画的实现就介绍完毕了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: