标签:基础 sdn class ondraw 定义 ted encoding creat this
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
标签:基础 sdn class ondraw 定义 ted encoding creat this
原文地址:http://www.cnblogs.com/xiaozhuazheng/p/6664156.html