安卓沿Path运动轨迹
来源:互联网 发布:sql not in() 编辑:程序博客网 时间:2024/05/16 08:54
当然是先看效果拉~中间那个圆圈,顺着圆圈的轨迹运动。
实现一个跟随Path路径运动的效果
思路
1.绘制一个路径
2.得到路径的每个点的坐标
3.用属性动画沿着路径点的坐标运动
实现
1.用
mPathMeasure = new PathMeasure(mPath,false);mPathMeasure.getPosTan(0, mCurrentPosition, null);
得到每个点的坐标(我是根据 http://blog.csdn.net/tianjian4592/article/details/47067161 这篇博客学习的)
PathMeasure 就是把 Path “拉直”,然后给了我们一个接口(getLength)告诉我们path的总长度,我们再根据具体的长度取得相应坐标
2.属性动画,用的是ValueAniamtor
代码
package com.example.myapp.view;import android.animation.Animator;import android.animation.ValueAnimator;import android.content.Context;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.graphics.Path;import android.graphics.PathMeasure;import android.util.AttributeSet;import android.view.View;import android.view.animation.AccelerateDecelerateInterpolator;/** * Created by zyr * DATE: 16-3-7 * Time: 上午11:52 * Email: yanru.zhang@renren-inc.com */public class HeartView extends View { private Paint mPaint; private Path mPath; private Path mPath2; private Paint mPaint2; private ValueAnimator valueAnimator; private PathMeasure mPathMeasure; private float[] mCurrentPosition = new float[2]; public HeartView(Context context) { this(context, null); } public HeartView(Context context, AttributeSet attrs) { this(context, attrs, 0); } public HeartView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(); } private void init() { mPaint = new Paint(Paint.ANTI_ALIAS_FLAG); mPaint.setColor(Color.RED); mPaint.setTextSize(40); mPaint.setStyle(Paint.Style.STROKE); mPaint2 = new Paint(Paint.ANTI_ALIAS_FLAG); mPaint2.setColor(Color.BLUE); mPaint2.setTextSize(40); mPaint2.setStyle(Paint.Style.FILL); mPath = new Path(); mPath.addCircle(200, 200, 200, Path.Direction.CW); mPath2 = new Path(); mPathMeasure = new PathMeasure(mPath,false); mPathMeasure.getPosTan(0, mCurrentPosition, null); mPath2.moveTo(mCurrentPosition[0], mCurrentPosition[1]); setLayerType(View.LAYER_TYPE_SOFTWARE, null);//关闭硬件加速 valueAnimator = ValueAnimator.ofFloat(0,mPathMeasure.getLength()); valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { float value = (Float)animation.getAnimatedValue(); mPathMeasure.getPosTan(value, mCurrentPosition, null); mPath2.lineTo(mCurrentPosition[0],mCurrentPosition[1]); postInvalidate(); } }); valueAnimator.addListener(new Animator.AnimatorListener() { @Override public void onAnimationStart(Animator animation) { } @Override public void onAnimationEnd(Animator animation) { } @Override public void onAnimationCancel(Animator animation) { } @Override public void onAnimationRepeat(Animator animation) { mPath2 = new Path(); mPathMeasure = new PathMeasure(mPath,false); mPathMeasure.getPosTan(0, mCurrentPosition, null); mPath2.moveTo(mCurrentPosition[0], mCurrentPosition[1]); if(mPaint2.getColor() == Color.BLUE){ mPaint2.setColor(Color.YELLOW); }else{ mPaint2.setColor(Color.BLUE); } } }); valueAnimator.setDuration(5000); valueAnimator.setRepeatCount(-1); valueAnimator.setInterpolator(new AccelerateDecelerateInterpolator()); valueAnimator.start(); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { setMeasuredDimension(500,500); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); canvas.drawColor(Color.BLACK); canvas.save(); canvas.translate(50, 50); canvas.drawPath(mPath, mPaint); canvas.drawCircle(mCurrentPosition[0], mCurrentPosition[1], 20, mPaint); canvas.drawPath(mPath2, mPaint2); canvas.restore(); }}
0 0
- 安卓沿Path运动轨迹
- 运动轨迹
- 运动轨迹
- 运动轨迹
- 一个正弦曲线运动轨迹
- 彩色运动轨迹特效
- 运动轨迹持续画法
- IOS 文字轨迹path
- google地图--运动轨迹(自己上班的运动轨迹)
- javascript实现椭圆运动轨迹
- google 地图 V3 运动轨迹
- 百度地图车辆运动轨迹
- 常用运动轨迹的算式
- 地图沿直线轨迹运动
- 视图动画沿轨迹运动
- 光点沿圆角按钮运动轨迹动画
- 车辆运动轨迹数据集
- 抛物运动轨迹线01
- shell--读取文件
- 该如何旋转EDIUS 8中的图片
- Eventbus简单使用
- WKWebView高级使用
- 在Beaglebone Black板上使用Yocto移植Qt5
- 安卓沿Path运动轨迹
- IOS viewDidLoad方法被执行两次(viewDidLoad和loadView方法详解)
- 【Egret】 3D 使用中的一些疑难解决技巧!
- linux 下VSFTP 530 Permission denied错误的解决方法
- HDOJ 2089 不要62(打表)
- 中国期刊数据库元数据信息的多线程爬取
- java 日志技术汇总
- oracle数据库创建表空间步骤
- OpenGL