Android 自定义属性动画&Camera动画
2017-01-13 18:30
337 查看
摘要: Android 自定义属性动画&Camera动画
1.相关知识点
对于Androi的帧动画,可以制作gif图片,有时为了能够动态的生成帧动画,就得需要使用代码构建了
AnimationDrawable类中使用 addFrame用来添加帧。
AnimationDrawable类中使用 start来启动动画。
AnimationDrawable类中使用 stop来停止动画。
当移动位置不是相对于ParentView或者Window时,补间动画只实现了View图像位置的改变,但控件并没有发生位移
说明:当属性动画移动后,如果不会到原来的位置,那么点击新的位置,将接受不到Click事件,点击原来的位置可以接收到点击事件
补间动画通过不断的调用OnDraw方法来进行UI的绘制,而属性动画一般只调用ViewGroup进行绘制
属性动画不会主动恢复到原来的状态,而是一直保持新的状态,直到下一次改变
属性动画可以使用playToggther,play..with,play...[width]... after,playSequentaily进行动画的控制,使用起来非常方便
属性动画可以通过ObjectAnimator和PropertyValueHolder进行动态控制,增加了动画的灵活性
2.pivot:X和piovtY中心点
中心点对所有动画属性都起作用,scale(参见QQ侧滑),translate,rotate
中心点描述了动画的发展方向
另外对于补间动画的理解中容易出现错误的地方,更正如下:
RotateAnimation ra = new RotateAnimation(fromDegrees, toDegrees, pivotX, pivotY)
pivotX,pivotY当数值大于1时表示的是实际像素
RotateAnimation ra = new RotateAnimation(fromDegrees, toDegrees, pivotXType, pivotXValue, pivotYType, pivotYValue)
pivotX,pivotY当数值大于1时表示的是比例位置
3.Animation自定义动画
3.1继承Animation自定义动画
3.2使用ValueAnimator结合监听器自定义动画
3.3使用TypeEvaluator自定义动画
或如下使用
4.通关过扩展原有属性方式自定义动画
(由于属性动画的属性必须具有setter与getter,对于一些特别的属性,需要使用代理)
使用方法
Android 自定义动画Animation 使用Camera实现3D动画效果,这里的Camera不是相机,而是场景动画,意味着有导演
1.相关知识点
对于Androi的帧动画,可以制作gif图片,有时为了能够动态的生成帧动画,就得需要使用代码构建了
AnimationDrawable类中使用 addFrame用来添加帧。
AnimationDrawable类中使用 start来启动动画。
AnimationDrawable类中使用 stop来停止动画。
当移动位置不是相对于ParentView或者Window时,补间动画只实现了View图像位置的改变,但控件并没有发生位移
说明:当属性动画移动后,如果不会到原来的位置,那么点击新的位置,将接受不到Click事件,点击原来的位置可以接收到点击事件
补间动画通过不断的调用OnDraw方法来进行UI的绘制,而属性动画一般只调用ViewGroup进行绘制
属性动画不会主动恢复到原来的状态,而是一直保持新的状态,直到下一次改变
属性动画可以使用playToggther,play..with,play...[width]... after,playSequentaily进行动画的控制,使用起来非常方便
属性动画可以通过ObjectAnimator和PropertyValueHolder进行动态控制,增加了动画的灵活性
2.pivot:X和piovtY中心点
中心点对所有动画属性都起作用,scale(参见QQ侧滑),translate,rotate
中心点描述了动画的发展方向
另外对于补间动画的理解中容易出现错误的地方,更正如下:
RotateAnimation ra = new RotateAnimation(fromDegrees, toDegrees, pivotX, pivotY)
pivotX,pivotY当数值大于1时表示的是实际像素
RotateAnimation ra = new RotateAnimation(fromDegrees, toDegrees, pivotXType, pivotXValue, pivotYType, pivotYValue)
pivotX,pivotY当数值大于1时表示的是比例位置
3.Animation自定义动画
3.1继承Animation自定义动画
public class CustomAnimation extends Animation { @Override protected void applyTransformation(float interpolatedTime, Transformation t) { super.applyTransformation(interpolatedTime, t); t.getMatrix().setTranslate((float) (Math.sin(10*interpolatedTime)*50), 0); } }
3.2使用ValueAnimator结合监听器自定义动画
final ShapeHolder ball5 = balls.get(4); ValueAnimator valueAnimator5 = ValueAnimator.ofFloat(0f, getHeight() - ball5.getHeight()); valueAnimator5.setDuration(500); valueAnimator5.addUpdateListener(new AnimatorUpdateListener() { // ValueAnimator需要自己在监听处理中设置对象参数 @Override public void onAnimationUpdate(ValueAnimator animation) { // 用animation.getAnimatedValue()得到当前的属性值,设置进动画对象中 ball5.setY((Float) animation.getAnimatedValue()); // 记得要刷新View否则不会调用重新绘制 invalidate(); } });
3.3使用TypeEvaluator自定义动画
public class Point { private float x; private float y; public Point(float x, float y) { this.x = x; this.y = y; } public void setX(float x){ this.x = x } public void setY(float y){ this.y = y; } public float getX() { return x; } public float getY() { return y; } }
public class PointEvaluator 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() - startPoint.getY()); Point point = new Point(x, y); return point; } }
public class MyTaget{ private Point point = new Point(0f,0f); public void setPoint(Point p){ this.point = point; } public Point getPoint(){ return this.point; } } Point point1 = new Point(0, 0); Point point2 = new Point(300, 300); ValueAnimator anim = ValueAnimator.ofObject(new PointEvaluator(), point1, point2); anim.setTarget(new MyTarget()); anim.setDuration(5000); anim.start();
或如下使用
ObjectAnimator.ofObject(Object target, String propertyName, TypeEvaluator evaluator, Object... values)
4.通关过扩展原有属性方式自定义动画
(由于属性动画的属性必须具有setter与getter,对于一些特别的属性,需要使用代理)
public class WrapperView{ private View targetView; public WrapperView(View targetView){ this.targetView = targetView; } public void setWidth(int width){ targetView.getLayoutParams().width = width; targetView.requestLayout(); } public int getWidth(){ return targetView.getLayoutParams().width; } }
使用方法
WrapperView wrapper = new WrapperView(mLinearLayout); ObjectAnimator.ofInt(wrapper,"width",300).setDuration(3000).start();
Android 自定义动画Animation 使用Camera实现3D动画效果,这里的Camera不是相机,而是场景动画,意味着有导演
public class MyAnimation extends Animation { int mCenterX,mCenterY; Camera camera = new Camera(); public MyAnimation() { } @Override protected void applyTransformation(float interpolatedTime, Transformation t) { Matrix matrix = t.getMatrix(); camera.save(); camera.translate(0f, 0f, (1300 - 1300*interpolatedTime)); camera.rotateY(360*interpolatedTime); camera.getMatrix(matrix); matrix.preTranslate(-mCenterX, -mCenterY); matrix.postTranslate(mCenterX,mCenterY); camera.restore(); } @Override public void initialize(int width, int height, int parentWidth, int parentHeight) { super.initialize(width, height, parentWidth, parentHeight); //初始化中间坐标 mCenterX = width/2; mCenterY = height/2; setDuration(2000); setFillAfter(true); setInterpolator(new LinearInterpolator()); } }
相关文章推荐
- Android属性动画(二) ValueAnimator的实际应用 & 自定义TypeEvaluator
- Android 自定义柱状图及属性动画
- Android动画学习-视图动画&属性动画(二)
- android自定义路径的属性动画
- Android 自定义view和属性动画实现充电进度条效果
- 从零开始学Android自定义View之动画系列——属性动画(2)
- Android UI设计之<二>自定义SwitchButton开关,实现类似IOS中UISwitch的动画效果
- android视图动画、属性动画、自定义动画、5.X SVG矢量动画机制详解
- Android自定义View和属性动画完美结合,创造出酷炫圆环动画,带标尺和进度
- Android 自定义view及其属性。友情链接底部有动画链接
- android 自定义view+属性动画实现充电进度条
- Android 2.x自定义属性动画ValueAnimator
- android&nbsp;自定义照相机Camera…
- Android 属性动画探究(一)——Interpolator解析与自定义
- 如何用windows8 metro&windows phone自定义依赖属性绑定动画
- Android动画学习-视图动画&属性动画(一)
- android 属性动画(view普通使用 和 自定义view使用)
- Android进阶学习-属性动画与自定义属性
- 从零开始学Android自定义View之动画系列——属性动画(3)
- 从零开始学Android自定义View之动画系列——属性动画(1)