一. Android二维动画的分类
1. 补间动画(Tween Animation):采用对单一的图形逐渐地移动,伸展或旋转来产生动画的效果,也可以逐渐地改变透明度。
2. 帧动画(Frame Animation):按顺序播放事先规划好的一系列图像来产生动画效果,就如同卡通电影的带子。
二. 补间动画 Tween Animation
1. 补间动画共同属性
duration[long] 动画显示的时间,一毫秒为单位。
fillAfter[boolean] 设置为true时,动画结束时,结束状态被应用,且不恢复。
fillBefore[boolean] 设置为true时,动画恢复动画开始之前的状态。
Interpolator 动画的内插件
accelerate_decelerate_interpolator 动画的改变速度逐渐加速再逐渐减速
accelerate_interpolator 动画的改变速度逐渐加速
decelerate_interpolator 动画的改变速度逐渐减速
cycle_interpolator 动画以正弦曲线速度改变
linear_interpolator 动画以线性均匀速率改变
repeateCount[int] 动画的重复次数
repeateMode[int] 动画的重复行为 restart:重新播放
reverse:反向播放
startOffset[long] 动画之间的间隔时间.
zAdajustment[int] 定义动画的Z轴模式.
3.alpha 透明度动画
<alpha
android:fromAlpha = “1.0”
android:toAlpha=”0.6”
android:duration=”3000”/>
fromAlpha 动画开始时的透明度
toAlpha 动画结束时的透明度
0.0表示完全透明
1.0表示完全不透明,数值去0.0-1.0之间的float数字。
4.scale 缩放动画
<scale
android:fromXScale=”1.6”
android:toXScale=”0.6”
android:fromYScale=”1.6”
android:toYScale=”0.6”
android:pivotX=”50%”
android:pivotY=”50%”
android:duration=”3000”/>
0.0表示收缩到不见
1.0表示正常没有收缩
值小于1.0表示收缩
值大于1.0表示放大
动画相对于对象的X,Y坐标的开始位置,以%来表示。
5.translate 移动动画
<translate
android:fromXDelta=”0”
android:toXDelta=”20”
android:fromYDelta=”0”
android:toYDelta=”10”
android:duration=”3000”/>
动画开始和结束时的X坐标的位置
动画开始和结束时的Y坐标的位置
6.rotate 图形旋转的动画效果
<rotate
android:fromDegrees=”0”
android:toDegress=”70”
android:pivotX=”50%”
android:pivotY=”50%”
android:duration=”3000”/>
fromDegrees 动画开始时的角度
toDegress 动画结束时的角度
from负数àto正数:顺时针旋转
from负数àto 负数:逆时针旋转
from 正数àto 正数:顺时针旋转
from 正数àto 负数:逆时针旋转
三. 如何引用res/anim/xxx.xml动画文件
通过AnimationUtils.loadAnimation()方法引用
代码:
AnimationSet animationSet = new AnimationSet(true);
Animation animation = AnimationUtils.loadAnimation(this,R.anim.button_animation);
animationSet.addAnimation(animation);
四. 一个完整的Tween Animation 动画集合的xxx.xml文件
代码:
<?xml version="1.0" encoding="UTF-8"?>
<set android:shareInterpolator="false"
xmlns:android="http://schemas.android.com/apk/res/android">
<scale
android:fromXScale="1"
android:toXScale="1.2"
android:fromYScale="1"
android:toYScale="1.2"
android:pivotX="50%"
android:pivotY="50%"
android:duration="100"
/>
<alpha
android:fromAlpha="1"
android:toAlpha="0.2"
android:duration="100"
/>
</set>
五:帧动画绘制对象 ---Frame Animation
采用AnimationDrawable类API 来写帧动画Frame Animation 程序代码,但是是定义动画XML窗体布局文件内的属性会更简单,这个动画XML窗体布局文件要保存在 /res/anim 目录内。按照所规划动画的帧顺序来排列,并用android:duration属性设置每一个帧的停留时间。
动画XML文件窗体布局文件包括有一个主要组件<animation-list>标签和许多在<animation-list>标签内的<item>标签,每一个<item>标签都是一个帧,您需要定义它的文件名和停留时间。
代码:
<animation-list xmlns:android= xmlns:android="http://schemas.android.com/apk/res/android"
android:oneshot="true">
<item android:drawable="@drawable/girl_1" android:duration="400" />
<item android:drawable="@drawable/girl_2" android:duration="400" />
<item android:drawable="@drawable/girl_3" android:duration="400" />
<item android:drawable="@drawable/girl_4" android:duration="400" />
<item android:drawable="@drawable/girl_5" android:duration="400" />
</animation-list>
xxx.java 代码部分:
public class MFrameAnimActivity extends Activity {
AnimationDrawable mAnimationDrawable;
ImageView mImageView;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mImageView = (ImageView)findViewById(R.id.mImageView);
}
@Override
protected void onResume() {
super.onResume();
mImageView.setBackgroundResource(R.anim.donghua);
mAnimationDrawable = (AnimationDrawable)mImageView.getBackground();
}
//Start Frame Animation动画
public boolean onTouchEvent(MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
// mAnimationDrawable.start();
mAnimationDrawable.run();
return true;
}
return super.onTouchEvent(event);
}
}
五. 直接在画布上描绘图形----Canvas
当编写一个绘图应用程序,希望可以做特别的绘图处理或控制图形的动作时,您需要使用称为画布(Canvas)的对象。
Canvas对您实际上绘制的图形表面来说好比是一个界面接口,它会保持住所有“draw”调用方法。通过Canvas,您的绘图实际上是在Bitmap图形上执行,再放到window上。
您的绘图在采用onDraw()callback方法时,会获得一个Canvas,只要将绘制调用方法放到上面。当对象是SurfaceView视图时,也可以使用SurfaceHolder.lockCanvas()方法取得一个Canvas。
代码:
Bitmap mBitmap = Bitmap.createBitmap(100,100,Bitmap.Config.ARGB_8888);
Canvas mCanvas = new Canvas(mBitmap);
或放到Canvas的某一位置
Bitmap mBitmap = BitmapFactory.decodeResource(getResource(),R.drawable.icon);
Canvas canvas = new Canvas();
canvas.drawBitmap(mBitmap,100,100,mPaint);
代码:
public class MCanvasActivity extends Activity {
private Bitmap bitmap;
private MView mView;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher);
mView = new MView(this);
setContentView(mView);
}
private class MView extends View{
private Paint paint;
private float imageX = 0f;
private float imageY = 0f;
public MView(Context context) {
super(context);
paint = new Paint();
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawColor(Color.WHITE);
paint.setAntiAlias(true);
paint.setColor(Color.BLUE);
canvas.drawText(getString(R.string.hello), 100, 20, paint);
canvas.drawBitmap(bitmap, imageX-bitmap.getWidth()/2, imageY-bitmap.getHeight()/2,paint);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
switch(event.getAction()){
case MotionEvent.ACTION_DOWN:
imageX = event.getX();
imageY = event.getY();
break;
case MotionEvent.ACTION_MOVE:
imageX = event.getX();
imageY = event.getY();
break;
case MotionEvent.ACTION_UP:
imageX = event.getX();
imageY = event.getY();
break;
}
//再描绘的指示
invalidate();
return true;
}
}
}