Android动画之旅(三)----6个小球移动的轨迹动画
来源:互联网 发布:安卓源码在线生成apk 编辑:程序博客网 时间:2024/06/05 23:08
动画组成:1.贝塞尔曲线和PathMeasure结合使用。2. mPathMeasure.getPosTan(float v,float [] pos ,float[] tan)的使用。3.通过动画0到1形成轨迹动画。
package com.example.administrator.animationworkdemo.views;import android.animation.Animator;import android.animation.AnimatorListenerAdapter;import android.animation.ValueAnimator;import android.content.Context;import android.graphics.Canvas;import android.graphics.Paint;import android.graphics.Path;import android.graphics.PathMeasure;import android.util.AttributeSet;import android.view.View;import android.view.animation.DecelerateInterpolator;/** * Created by SuperD on 2017/2/18. * 小球加载的运动轨迹 */public class BallLoadingPathView extends View implements View.OnClickListener { private static final int POINT_DISTANCE = 50; private static final int ANIM_RUNNING_TIME = 1000; //小球相关的描述 private int mPointCount = 6; private int mPointRadius = 20; //中心点 private int centerX; private int centerY; //首尾点之前的长度(加上隐藏的那个点,实际上有7个点) private float mWidth; //起始点,结束点 private float mPointStartX; private float mPointEndX; private float mPointY; //绘制路径 private PathMeasure mPathMeasure; //储存在路径移动过程中的点 private float[] mPos = new float[2]; private Path mPath; private float mPathLength; //轨迹动画的比率 private float mPathRatio; private Paint mPaint; private ValueAnimator mPathAnim; //小球运动的标签 True的时候mPointFlag--向下 False的时候mPointFlag--- 向上 private int mPointFlag = 1; public BallLoadingPathView(Context context) { this(context, null); } public BallLoadingPathView(Context context, AttributeSet attrs) { this(context, attrs, 0); } public BallLoadingPathView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(); } private void init() { mPathMeasure = new PathMeasure(); mPath = new Path(); mPaint = new Paint(Paint.ANTI_ALIAS_FLAG); mPaint.setStyle(Paint.Style.FILL_AND_STROKE); mPaint.setStrokeWidth(5); mPathAnim = ValueAnimator.ofFloat(0, 1); mPathAnim.setDuration(ANIM_RUNNING_TIME); mPathAnim.setRepeatCount(ValueAnimator.INFINITE); mPathAnim.setInterpolator(new DecelerateInterpolator()); mPathAnim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator valueAnimator) { mPathRatio = (float) valueAnimator.getAnimatedValue(); invalidate(); } }); mPathAnim.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationRepeat(Animator animation) { super.onAnimationRepeat(animation); mPointFlag = -mPointFlag; } }); setOnClickListener(this); } @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh); centerX = w / 2; centerY = h / 2; mWidth = (mPointCount - 1) * mPointRadius * 2 + (mPointCount - 1) * POINT_DISTANCE; mPointStartX = centerX - mWidth / 2; mPointEndX = centerX + mWidth / 2; mPointY = centerY; mPath.moveTo(mPointStartX, mPointY); mPath.quadTo(centerX, centerY + mWidth / 2, mPointEndX, mPointY); mPathMeasure.setPath(mPath, false); mPathLength = mPathMeasure.getLength(); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); for (int i = 0; i < mPointCount; i++) { if (i == 0) { mPathMeasure.getPosTan(mPathRatio * mPathLength, mPos, null); if (mPointFlag == 1) { canvas.drawCircle(mPos[0], mPos[1], mPointRadius, mPaint); } else { canvas.drawCircle(mPos[0], getSymmetryPointY(mPos[1]), mPointRadius, mPaint); } } else { float startPoint = mPointStartX + (POINT_DISTANCE + 2 * mPointRadius) * i; canvas.drawCircle( startPoint - (POINT_DISTANCE + 2 * mPointRadius) * mPathRatio, mPointY, mPointRadius, mPaint); } } } /** * 获得当前Y坐标关于屏幕中心Y轴的对称点 * * @param pointY * @return */ private float getSymmetryPointY(float pointY) { float symmetryPointY = 2 * centerY - pointY; return symmetryPointY; } @Override public void onClick(View view) { mPathAnim.start(); }}
2 0
- Android动画之旅(三)----6个小球移动的轨迹动画
- Android动画之旅(一)----小球弹起动画
- Android动画之旅(四)----小球拟合动画
- Android动画之旅(二)----两个小球旋转的动画,形成视觉差的效果
- android跳动的小球动画
- android之Animation自定义动画轨迹
- Android 椭圆轨迹动画
- 小球的自由落体动画
- Android 动画--使用Path来规划动画的轨迹
- Android 动画之属性动画(三)
- Android动画之帧动画(三)
- css3做圆形轨迹移动动画
- 轨迹动画演示的例子
- 一个简单的轨迹动画
- 简单的Android之移动小球
- android动画-移动动画问题
- Android实现跳动的小球加载动画效果
- Android动画之translate(位移动画)上下移动
- 【九度OJ】题目1435:迷瘴 解题报告
- C#中的多态
- 文字检测和识别5-LSTM简介
- JQuery EasyUI属性和常见用法
- Spark -12:spark checkpoint机制
- Android动画之旅(三)----6个小球移动的轨迹动画
- java基础之集合List
- js 通过 zip.js打开服务器(本地)中的压缩文件
- 蓝桥杯 买不到的数目(类背包)
- C#中的继承
- java基础
- ESB && ETL
- JS的一些面试题(自己试答案)
- 计算文本相似度