一、RotatView

package com.sun.shine.myrotation.view;import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.drawable.BitmapDrawable;
import android.os.Handler;
import android.os.Message;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.SurfaceView;
import android.view.View;public class RotatView extends View {float o_x;float o_y;Handler handler;int delayedTime = 20;static final int play = 0;static final int stop = 1;double currentTime = 0;int width;int height;double maxwidth;Bitmap rotatBitmap;public RotatView(Context context, AttributeSet attrs) {super(context, attrs);init();}private void init() {vRecord = new VRecord();handler = new Handler() {@Overridepublic void handleMessage(Message msg) {double detaTime = System.currentTimeMillis() - currentTime;switch (msg.what) {case play: {if (isClockWise) {speed = speed - a * detaTime;if (speed <= 0) {return;} else {handler.sendEmptyMessageDelayed(play, delayedTime);}} else {speed = speed + a * detaTime;if (speed >= 0) {return;} else {handler.sendEmptyMessageDelayed(play, delayedTime);}}addDegree((float)(speed * detaTime + (a * detaTime * detaTime) / 2));// if (a < a_max) {// a = (float)(a + a_add*detaTime);// System.out.println("a:"+a);// }currentTime = System.currentTimeMillis();invalidate();break;}case stop: {speed = 0;handler.removeMessages(play);}}super.handleMessage(msg);}};initSize();}public void setRotatBitmap(Bitmap bitmap) {rotatBitmap = bitmap;initSize();postInvalidate();}public void setRotatDrawableResource(int id) {BitmapDrawable drawable = (BitmapDrawable)getContext().getResources().getDrawable(id);setRotatDrawable(drawable);}public void setRotatDrawable(BitmapDrawable drawable) {rotatBitmap = drawable.getBitmap();initSize();postInvalidate();}private void initSize() {if (rotatBitmap == null) {// throw new NoBitMapError("Error,No bitmap in RotatView!");return;}width = rotatBitmap.getWidth();height = rotatBitmap.getHeight();maxwidth = Math.sqrt(width * width + height * height);o_x = o_y = (float)(maxwidth / 2);// ȷ��Բ�����}private void addDegree(float added) {deta_degree += added;if (deta_degree > 360 || deta_degree < -360) {deta_degree = deta_degree % 360;}}@Overrideprotected void onDraw(Canvas canvas) {Matrix matrix = new Matrix();matrix.setTranslate((float)width / 2, (float)height / 2);matrix.preRotate(deta_degree);matrix.preTranslate(-(float)width / 2, -(float)height / 2);matrix.postTranslate((float)(maxwidth - width) / 2, (float)(maxwidth - height) / 2);canvas.drawBitmap(rotatBitmap, matrix, paint);super.onDraw(canvas);}Paint paint = new Paint();@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {// TODO Auto-generated method stubsuper.onMeasure(widthMeasureSpec, heightMeasureSpec);setMeasuredDimension((int)maxwidth, (int)maxwidth);}float down_x;float down_y;float target_x;float target_y;float up_x;float up_y;float current_degree;float up_degree;float deta_degree;double lastMoveTime = 0;public static final float a_min = 0.001f;public static final float a_add = 0.001f;float a = a_min;public static final float a_max = a_min * 5;double speed = 0;VRecord vRecord;boolean isClockWise;@Overridepublic boolean onTouchEvent(MotionEvent event) {// TODO Auto-generated method stubif (rotatBitmap == null) {throw new NoBitMapError("Error,No bitmap in RotatView!");}switch (event.getAction()) {case MotionEvent.ACTION_DOWN: {down_x = event.getX();down_y = event.getY();current_degree = detaDegree(o_x, o_y, down_x, down_y);vRecord.reset();// handler.sendEmptyMessage(stop);a = a_max;break;}case MotionEvent.ACTION_MOVE: {down_x = target_x = event.getX();down_y = target_y = event.getY();float degree = detaDegree(o_x, o_y, target_x, target_y);float dete = degree - current_degree;if (dete < -270) {dete = dete + 360;} else if (dete > 270) {dete = dete - 360;}lastMoveTime = System.currentTimeMillis();vRecord.add(dete, lastMoveTime);addDegree(dete);current_degree = degree;postInvalidate();break;}case MotionEvent.ACTION_CANCEL:case MotionEvent.ACTION_UP: {a = a_min;double lastupTime = System.currentTimeMillis();double detaTime = lastupTime - lastMoveTime;up_x = event.getX();up_y = event.getY();up_degree = detaDegree(o_x, o_y, up_x, up_y);speed = speed + vRecord.getSpeed();if (speed > 0) {speed = Math.min(VRecord.max_speed, speed);} else {speed = Math.max(-VRecord.max_speed, speed);}// System.out.println("speed:" + speed);if (speed > 0) {isClockWise = true;// v = 1;} else {isClockWise = false;// v = -1;}currentTime = System.currentTimeMillis();handler.sendEmptyMessage(0);break;}}return true;}float detaDegree(float src_x, float src_y, float target_x, float target_y) {float detaX = target_x - src_x;float detaY = target_y - src_y;double d;if (detaX != 0) {float tan = Math.abs(detaY / detaX);if (detaX > 0) {if (detaY >= 0) {d = Math.atan(tan);} else {d = 2 * Math.PI - Math.atan(tan);}} else {if (detaY >= 0) {d = Math.PI - Math.atan(tan);} else {d = Math.PI + Math.atan(tan);}}} else {if (detaY > 0) {d = Math.PI / 2;} else {d = -Math.PI / 2;}}return (float)((d * 180) / Math.PI);}static class NoBitMapError extends RuntimeException {/*** */private static final long serialVersionUID = 1L;public NoBitMapError(String detailMessage) {super(detailMessage);}}static class VRecord {int addCount;public static final int length = 15;double[][] record = new double[length][2];public void add(double detadegree, double time) {for (int i = length - 1; i > 0; i--) {record[i][0] = record[i - 1][0];record[i][1] = record[i - 1][1];}record[0][0] = detadegree;record[0][1] = time;addCount++;}public static final double max_speed = 8;public double getSpeed() {if (addCount == 0) {return 0;}int maxIndex = Math.min(addCount, length) - 1;if ((record[0][1] - record[maxIndex][1]) == 0) {return 0;}double detaTime = record[0][1] - record[maxIndex][1];double sumdegree = 0;for (int i = 0; i < length - 1; i++) {sumdegree += record[i][0];// System.out.println(record[i][0]);}// System.out.println("----------");// System.out.println(sumdegree);// System.out.println(detaTime);double result = sumdegree / detaTime;if (result > 0) {return Math.min(result, max_speed);} else {return Math.max(result, -max_speed);}// System.out.println("v=" + result);}public void reset() {addCount = 0;for (int i = length - 1; i > 0; i--) {record[i][0] = 0;record[i][1] = 0;}}}@Overrideprotected void onDetachedFromWindow() {super.onDetachedFromWindow();if (rotatBitmap != null) {rotatBitmap.recycle();rotatBitmap = null;}}
}

二、MainActivity

package com.sun.shine.myrotation;import com.sun.shine.myrotation.view.RotatView;import android.os.Bundle;
import android.app.Activity;public class MainActivity extends Activity {@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);RotatView rotatView=(RotatView)findViewById(R.id.myRotatView);rotatView.setRotatDrawableResource(R.drawable.cycle);}}

android开发旋转罗盘、风车相关推荐

  1. android旋转动画惯性,android 之旋转罗盘 风车 开发

    我要介绍的是一个 能旋转的view,说这个view能旋转有点不切实际,那是视觉效果,其实是对图片的旋转.目前它只支持图片.你可以把它认为是一个能响应手势旋转的View. 它的功能有: 1.会响应手势旋 ...

  2. android 之旋转罗盘 风车 开发 Android 随手指旋转图片

    原帖地址 源码下载地址 我要介绍的是一个 能旋转的view,说这个view能旋转有点不切实际,那是视觉效果,其实是对图片的旋转.目前它只支持图片.你可以把它认为是一个能响应手势旋转的View. 它的功 ...

  3. Android开发实践:屏幕旋转的处理

    最近开发Android Camera相关的程序,被屏幕旋转搞得头大,一方面得考虑屏幕旋转后布局的变化,另一方面得搞清楚屏幕的旋转方向.角度与Camera的Preview角度的关系.本来通过重载Acti ...

  4. android旋转不重绘,Android自定义view仿微信刷新旋转小风车

    本文实例为大家分享了Android仿微信刷新旋转小风车 具体代码,供大家参考,具体内容如下 不太会录像,没办法,智能截图了 不多说了,直接上代码 package com.shipneg.demoysp ...

  5. android 三星调用拍照功能吗,Android 开发手机(三星)拍照应用照片旋转问题解决办法...

    Android 开发手机(三星)拍照应用照片旋转问题解决办法 最近解决了一个令我头疼好久的问题,就是三星手机拍照图片旋转的问题,项目中有上传图片的功能,那么涉及到拍照,从相册中选择图片,别的手机都ok ...

  6. Android旋转视频工具类,Android开发实现的IntentUtil跳转多功能工具类【包含视频、音频、图片、摄像头等操作功能】...

    本文实例讲述了Android开发实现的IntentUtil跳转多功能工具类.分享给大家供大家参考,具体如下: 说明:此工具类是本人开发中总结下来的,还有其它的跳转亲给我留言,希望大家一起把这个工具类打 ...

  7. android+动画+锯齿,Android_rotate--animation 动画旋转两图片,消除动画锯齿现象 android 开发:动画旋转两图片 - 下载 - 搜珍网...

    Android+动画旋转两图/ Android+动画旋转两图/.classpath Android+动画旋转两图/.project Android+动画旋转两图/.settings/ Android+ ...

  8. Android开发必备(干货源码放送大)

    Android源码大放送(实战开发必备) 文件夹 PATH 列表 │  javaapk.com文件列表生成工具.bat │  使用说明.txt │  免费下载更多源码.url │  目录列表.txt ...

  9. Android开发常见问题及解答

    搭建Android开发环境时容易出现什么问题?有哪些地方需要注意? 1.环境搭建过程中,往往会出现安装配置或者环境变量配置遗漏或者放置地方不匹配,导致后续找不到位置,因此需要考虑好安装各个软件的步骤及 ...

最新文章

  1. 聚类分析基础知识总结及实战解析
  2. 数据结构:希尔排序(shell sort)
  3. 安装 | Window下Visual Studio VS2015 VS2017 各版本下载地址
  4. mysql数据库生成json_Python3实现 将MySQL数据库中的记录生成JSON数据
  5. 20155327第三周学习总结
  6. Spring Boot 核心知识,深入剖析!
  7. 易语言 图片插入超级列表框_是谁说图片排版很难?掌握这4个PPT图片排版技巧,1分钟全部搞定...
  8. 周围剃光头顶留长发型_发型改变气质,这话放在石原里美身上也通用啊
  9. CSS如何让图片垂直并水平居中等比缩放?
  10. 13.熟悉JDK的配置,环境变量
  11. jquery图片延迟加载 及 serializeArray、serialize用法记录
  12. jsp+ssh+mysql Java web学生考勤管理系统源码附视频指导运行教程
  13. JavaWeb项目打包运行
  14. js 获取屏幕高宽_Js获取屏幕宽度、高度
  15. 基于itext的pdf拼接
  16. mysql课设体会_课程设计心得体会8篇
  17. 沈春华加入腾讯优图!金榕离职阿里达摩院...
  18. K8s 污点(Taints)与容忍(Tolerations)
  19. 验证哥德巴赫猜想:任何一个大于等于6的偶数均可表示为两个素数的和。如6=3+3,8=3+5,,18=5+13。试编写程序,要求将输入的一个偶数表示成两个素数之和。 输入输出样例如下:
  20. kafka-eagle-2.0.1安装及使用(超详细)

热门文章

  1. PADS的快捷键总结
  2. 2022年中国无气喷涂机市场现状研究分析
  3. 百度地图开发入门(1):案例
  4. 黄金周认真推荐几个真正的顶尖大佬和公号
  5. 激光条纹中心提取——方法总结
  6. 北京筑龙:采购供应链平台构建能源企业 数智信创供应链的必经之路
  7. win7无法启动承载网络问题
  8. 【小程序】语音识别 (无需转码、无需后台)
  9. 进程调度之FCFSSJF算法(C语言版)
  10. 4、交易开拓者-TB用户函数