Android动画基础

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android动画基础相关的知识,希望对你有一定的参考价值。

android动画主要有三种:

1> 视图动画,也叫Tween(补间)动画可以在一个视图容器内执行一系列简单变换(位置、大小、旋转、透明度)。譬如,如果你有一个TextView对象,您可以移动、旋转、缩放、透明度设置其文本,当然,如果它有一个背景图像,背景图像会随着文本变化。

补间动画通过XML或Android代码定义,建议使用XML文件定义,因为它更具可读性、可重用性。

2> Drawable动画其实就是Frame动画(帧动画),它允许你实现像播放幻灯片一样的效果,这种动画的实质其实是Drawable,所以这种动画的XML定义方式文件一般放在res/drawable/目录下。

3> Android 3.0以后引入了属性动画,属性动画可以轻而易举的实现许多View动画做不到的事,上面也看见了,View动画无非也就做那几种事情,别的也搞不定,而属性动画就可以的,譬如3D旋转一张图片。其实说白了,你记住一点就行,属性动画实现原理就是修改控件的属性值实现的动画。

特别注意的是,补间动画和帧动画并没有改变布局。比如当button移动后,在最终位置是无法相应点击事件的,需要点击Button在布局中的位置才生效。

属性动画的基本用法参照: http://blog.csdn.net/guolin_blog/article/details/43536355

通过属性动画实现一个圆从屏幕左上角移动到右下角。

1> 定义Point类:

public class Point {
    public float x;
    public float y;

    public Point(float x,float y){
        this.x = x;
        this.y = y;
    }

    public float getX() {
        return x;
    }

    public float getY() {
        return y;
    }
}

2> 定义核心类实现TypeEvaluator接口并重写evaluate()方法

public class PointEvalutor implements TypeEvaluator {
    @Override
    public Object evaluate(float fraction, Object startValue, Object endValue) {
        Point StartPoint = (Point) startValue;
        Point EndPoint = (Point) endValue;
        float x = StartPoint.getX() + fraction * (EndPoint.getX() - StartPoint.getX());
        float y = StartPoint.getY() + fraction * (EndPoint.getY() - EndPoint.getY());
        Point point = new Point(x,y);
        return point;
    }
}

3> 自定义View

public class AnimationView extends View {
    private static final float RADIUS = 50f;
    private Point currentPoint;
    private Paint mPaint;

    public AnimationView(Context context, AttributeSet attrs) {
        super(context, attrs);
        mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
        mPaint.setColor(Color.RED);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        if (currentPoint == null){
            currentPoint = new Point(RADIUS,RADIUS);
            drawCricle(canvas);
            startAnimation();
        }else {
            drawCricle(canvas);
        }
    }
    public void drawCricle(Canvas canvas){
        float x = currentPoint.getX();
        float y = currentPoint.getY();
        canvas.drawCircle(x,y,RADIUS,mPaint);
    }

    public void startAnimation(){
        Point startPoint = new Point(RADIUS,RADIUS);
        Point endPoint = new Point(getWidth() - RADIUS , getHeight() - RADIUS);
        ValueAnimator animator = new ValueAnimator().ofObject(new PointEvalutor(),startPoint,endPoint);
        animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                currentPoint =(Point) animation.getAnimatedValue();
                invalidate();
            }
        });
        animator.setDuration(5000);
        animator.start();
    }
}

4> xml文件

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.valuesanimation.MainActivity">

    <com.example.valuesanimation.AnimationView
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</RelativeLayout>

5> MainActivity

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
}

ok,搞定。

参考:

     补间动画和帧动画:http://blog.csdn.net/yanbober/article/details/46481171

     属性动画的高级用法:http://blog.csdn.net/guolin_blog/article/details/43816093

以上是关于Android动画基础的主要内容,如果未能解决你的问题,请参考以下文章

Android使用片段在viewpager中的页面滚动上放置动画

Android 动画布局和视图

如何在Android中加载带有动画的cardview GridView?

Android TV(leanback)中的持久标头片段(禁用动画)

片段交易动画:滑入滑出

java 将循环显示和不显示过渡动画添加到Android片段