Android 实现三种动画与特效经典


一. 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表示放大

动画相对于对象的XY坐标的开始位置,以%来表示。

 

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

采用AnimationDrawableAPI 来写帧动画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(bitmapimageX-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;

}

    }

}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值