Android自定义View图片按Path运动和旋转

作者:匆忙拥挤repeat 时间:2022-09-15 22:53:11 

本文实例为大家分享了Android自定义View图片按Path运动旋转的具体代码,供大家参考,具体内容如下

Android自定义View图片按Path运动和旋转

View:


/**
* author : stone
* email : aa86799@163.com
* time : 16/5/29 15 29
*/
public class EarthPathView extends View {

private Path mPath;
private Paint mPaint;
private Bitmap mBitmap;
private PathMeasure mPathMeasure;
private float[] mPoint;
private float[] mTan;
private float mDdegrees;

public EarthPathView(Context context) {
 this(context, null);
}

public EarthPathView(Context context, AttributeSet attrs) {
 this(context, attrs, 0);
}

public EarthPathView(Context context, AttributeSet attrs, int defStyleAttr) {
 super(context, attrs, defStyleAttr);

mPaint = new Paint();
 mPaint.setColor(Color.RED);
 mPaint.setStyle(Paint.Style.STROKE);
 mPaint.setStrokeWidth(10);

InputStream is = getResources().openRawResource(R.drawable.earth);
 mBitmap = BitmapFactory.decodeStream(is);

}

public void setPath(Path path) {
 mPath = path;
 mPathMeasure = new PathMeasure(path, false);
 mPoint = new float[2];
 mTan = new float[2];

}

@Override
protected void onDraw(Canvas canvas) {
 super.onDraw(canvas);
 if (mPath == null) {
  return;
 }

canvas.rotate(mDdegrees+=2, getWidth()/2, getHeight()/2);
 canvas.drawPath(mPath, mPaint);

float degress = (float) Math.toDegrees(Math.atan2(mTan[1], mTan[0]));
 Matrix matrix = new Matrix();
 matrix.postRotate(degress, mBitmap.getWidth() / 2, mBitmap.getHeight() / 2);
 matrix.postTranslate(mPoint[0] - mBitmap.getWidth() / 2, mPoint[1] - mBitmap.getHeight() / 2);
 canvas.drawBitmap(mBitmap, matrix, null);

}

@TargetApi(Build.VERSION_CODES.HONEYCOMB)
public void startAnim() {
 ValueAnimator animator = ValueAnimator.ofFloat(0, mPathMeasure.getLength());
 animator.setDuration(2000);
 animator.setInterpolator(new LinearInterpolator()); //插值器
 animator.setRepeatCount(ValueAnimator.INFINITE);
 animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
  @Override
  public void onAnimationUpdate(ValueAnimator animation) {
   float distance = (float) animation.getAnimatedValue();
   mPathMeasure.getPosTan(distance, mPoint, mTan);
   invalidate();
  }
 });
 animator.start();
}
}

Activity


package com.stone.canvaspath;

import android.app.Activity;
import android.graphics.Path;
import android.os.Bundle;

import com.stone.canvaspath.earth.EarthPathView;

/**
* author : stone
* email : aa86799@163.com
* time : 16/5/29 15 27
*/
public class EarthActivity extends Activity {

private EarthPathView mPathView;
private Path mPath;

@Override
protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);

int w = getResources().getDisplayMetrics().widthPixels;
 int h = getResources().getDisplayMetrics().heightPixels;

mPathView = new EarthPathView(this);

setContentView(mPathView);

int min = Math.min(w, h);
 buildPath(w / 2 + 100, h / 2 + 100, min / 4);

mPathView.setPath(mPath);

mPathView.startAnim();
}

private void buildPath(float x, float y, float radius) {
 mPath = new Path();
 mPath.addCircle(x, y, radius, Path.Direction.CW);
}

}

来源:http://blog.csdn.net/jjwwmlp456/article/details/52046767

标签:Android,View,运动旋转
0
投稿

猜你喜欢

  • JAVA生成短8位UUID的实例讲解

    2021-08-21 04:26:19
  • Springboot mybatis plus druid多数据源解决方案 dynamic-datasource的使用详解

    2021-08-01 19:27:32
  • Spring Boot项目如何同时支持HTTP和HTTPS协议的实现

    2023-11-19 19:57:05
  • c# 爬取优酷电影信息(1)

    2022-04-23 13:34:59
  • 基于@RestControllerAdvice与@ControllerAdvice的区别说明

    2022-06-24 21:00:36
  • Java 遍历list和map的方法

    2023-02-06 22:23:40
  • Windows系统中使用C#读取文本文件内容的小示例

    2023-05-05 20:27:08
  • Android播放assets文件里视频文件相关问题分析

    2021-08-10 20:04:41
  • springboot-jta-atomikos多数据源事务管理实现

    2022-08-29 19:45:47
  • Java C++ 算法题解leetcode652寻找重复子树

    2022-08-17 23:58:09
  • SpringBoot+LayIM+t-io 实现好友申请通知流程

    2023-07-13 11:41:52
  • Android Studio升级到3.0后遇到的坑

    2022-01-23 00:59:07
  • Java中自动生成构造方法详解

    2023-06-21 14:17:44
  • Yml转properties文件工具类YmlUtils的详细过程(不用引任何插件和依赖)

    2021-08-18 03:55:00
  • 详解Spring Cloud Gateway修改请求和响应body的内容

    2022-12-03 04:40:05
  • 解决Java导入excel大量数据出现内存溢出的问题

    2023-05-30 08:41:20
  • java代理模式(静态代理、动态代理、cglib代理)

    2022-11-22 16:12:49
  • 关于@RequestBody和@RequestParam注解的使用详解

    2023-01-20 09:08:20
  • SpringMvc框架的简介与执行流程详解

    2022-10-15 18:49:00
  • Android实现签名涂鸦手写板

    2022-07-27 04:10:14
  • asp之家 软件编程 m.aspxhome.com