话说有时候心血来潮,想到一个点子自己又感兴趣就会迫不及待的去做,在简单了解了安卓的事件派发机制之后,想做一个控件,

实现这样的效果:根据手滑动屏幕的速度和方向,让图片转动起来,并且持续时间和速度有关,转的圈数和时间有关,最后慢慢停下来,这个图模拟器上截的不是很好

实现思路:

1.自定义控件在onTouchEvent中,对ACTION_DOWN和ACTION_UP进行判断,记录开始和结束的两个点.

2.有了两个点,算出长度,当然肯定可以知道ACTION_DOWN的时候和ACTION_UP的时间,算出速度.

3有了速度,我们可以开始制作动画,setDuration的时间和速度有关,设置转了多少圈可以用速度乘以360(只为了实现效果这么写)

4 当然动画的两个特点

4.1 DecelerateInterpolator,使用这个可以让动画有快到慢,渐停的效果,很好用这个网上资料很多。

4.2 关于旋转的方法,我的判断比较简单,根据开始点,结束点,和图片的中点,比较判断结果

好了,下面贴下代码看看实现的过程

自定义控件TouchImageView.java

public class TouchImageView extends ImageView {public TouchImageView(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);mContext=context;}public TouchImageView(Context context, AttributeSet attrs) {super(context, attrs);mContext=context;}public TouchImageView(Context context) {super(context);mContext=context;}private Context mContext;private long mDownTime;//按下时间private long mUpTime;//松开时间private float mStartX;//开始xprivate float mStartY;//开始Yprivate float mEndX;//结束xprivate float mEndY;//结束Y@Overridepublic boolean onTouchEvent(MotionEvent event) {switch(event.getAction()){case MotionEvent.ACTION_DOWN:mDownTime=System.currentTimeMillis();mStartX=event.getX();mStartY=event.getY();clearAnimation();break;case MotionEvent.ACTION_MOVE:break;case MotionEvent.ACTION_UP:mUpTime=System.currentTimeMillis();mEndX=event.getX();mEndY=event.getY();isClockWise();//开始动画playAnimation();Toast.makeText(mContext, getSpeed()+" ", Toast.LENGTH_SHORT).show();break;}return true;}private void playAnimation() {RotateAnimation rotateAnimation=null;//判断是哪个方向rotateAnimation=isClockWise()?new RotateAnimation(0,(int)(getSpeed()*360),Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF,0.5f):new RotateAnimation((int)(getSpeed()*360),0,Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF,0.5f);DecelerateInterpolator dec=new DecelerateInterpolator(5f);rotateAnimation.setInterpolator(dec);rotateAnimation.setDuration((int)(getSpeed()*1000));rotateAnimation.setFillAfter(true);startAnimation(rotateAnimation);}//判断是否为顺时针旋转private boolean isClockWise(){int centerX=getMeasuredWidth()/2;int centerY=getMeasuredHeight()/2;//需要获得图片中心的位置,然后与按下和放开两个点之间进行判断,来决定//条件1:在中心点左边,由下往上滑动分别对应左边,右边,上面,下面资格位置if((mStartX<centerX&&mEndX<centerX&&mStartY>mEndY)||(mStartX>centerX&&mEndX>centerX&&mStartY<mEndY)||(mStartY<centerY&&mEndY<centerY&&mStartX<mEndX)||(mStartY>centerY&&mEndY>centerY&&mStartY>mEndY))return true;//其他情况下逆时针return false;}//获得线条的长度public double getLength(){double length = 0;if(mStartX!=0&&mStartY!=0&&mEndX!=0&&mEndY!=0&&mDownTime!=0&&mUpTime!=0)length =Math.sqrt((mStartX-mEndX)*(mStartX-mEndX)+(mStartY-mEndY)*(mStartY-mEndY));return length;}//获得你移动的速度,速度越快,速度越大public double getSpeed(){return getLength()/(mUpTime-mDownTime);}
}

初识Android自定义控件之旋转罗盘的制作相关推荐

  1. android 旋钮控件,Android自定义控件 温度旋转按钮

    封面 1.介绍 首先看下效果图 温度旋转按钮 2.思路 初始化一些参数 绘制刻度盘 绘制刻度盘下的圆弧 绘制标题与温度标识 绘制旋转按钮 绘制温度 处理滑动事件 提供一些接口方法 3.实现 初始化一些 ...

  2. 初识Android 制作一个简单的记账本

    初识Android 制作一个简单的记账本 主要功能 实现一个记账本页面 可以添加数据并更新到页面中 主要步骤 运行截图 主页面 点击红色按钮弹出添加页面 完成后自动更新到目录下 主要功能 实现一个记账 ...

  3. Android自定义控件进阶03-Canvas之画布操作

    Android自定义控件进阶03-Canvas之画布操作 本来想把画布操作放到后面部分的,但是发现很多图形绘制都离不开画布操作,于是先讲解一下画布的基本操作方法. 一.Canvas的常用操作速查表 操 ...

  4. android自定义view获取控件,android 自定义控件View在Activity中使用findByViewId得到结果为null...

    转载:http://blog.csdn.net/xiabing082/article/details/48781489 1.  大家常常自定义view,,然后在xml 中添加该view 组件..如果在 ...

  5. android汽车之家顶部滑动菜单,Android自定义控件之仿汽车之家下拉刷新

    关于下拉刷新的实现原理我在上篇文章Android自定义控件之仿美团下拉刷新中已经详细介绍过了,这篇文章主要介绍表盘的动画实现原理 汽车之家的下拉刷新分为三个状态: 第一个状态为下拉刷新状态(pull ...

  6. Android自定义控件之仿汽车之家下拉刷新

    感谢 阿拉灯神灯 的技术分享 .版权声明:原文来自http://blog.csdn.net/nugongahou110 关于下拉刷新的实现原理我在上篇文章Android自定义控件之仿美团下拉刷新中已经 ...

  7. Android自定义控件之自定义时钟

    Android自定义控件之自定义时钟 这个是我从别的开源项目中挖出来的,真心写的很不错,然后继续下来以便不时之需,直接上代码: WatcherBoard.java这个是自定义的时钟类 package ...

  8. android自定义波浪图,Android自定义控件--波浪图控件

    今天给大家分享一个android的波浪图控件制作.具体效果如下图所示: 上次有个app使用了这个控件,感觉特别酷炫.今天讲解一下这个控件的思路分析与代码编写. 思路分析: 1.绘制波浪图 2.移动波浪 ...

  9. Android自定义控件三部曲文章索引

    前言:在我从C++转到Android时,就被Android里炫彩斑斓的自定义控件深深折服,想知道如果想利用C++实现这些功能,那是相当困难的.从那时候起,我就想,等我学会了自定义控件,一定要写一篇系列 ...

最新文章

  1. Scikit-Learn大变化:合并Pandas
  2. 求求你,别在 MySQL 中使用 UTF-8了!
  3. 模板 -基础数据结构
  4. 一条命令monkey命令
  5. 【Python刷题】_1
  6. TopLink JPA
  7. axure如何页面滑动时广告位上移_Axure案例:滑动输入,学会这一招,你就能超越80%的人...
  8. python 实现冒泡排序
  9. 五款常见的bt磁力下载软件
  10. 绘画和照片编辑:Artstudio Pro for mac
  11. en结尾的单词_形容词加en前后缀变动词的英语单词
  12. 比赛对阵表(女排世界杯对阵表)
  13. 数学三次危机(四)第一次数学危机
  14. 关于华为昆仑关键业务服务器
  15. Java基础入门:IDEA软件安装和软件初始化设置
  16. 蛋白质相互作用位点标签的获取方法
  17. 《Spring响应式微服务》读书笔记
  18. React | React的JSX语法
  19. NDK编译时NDK_PROJECT_PATH = null
  20. 阿基米德优化算法AOA附Matlab代码

热门文章

  1. 蓝牙解锁Mac工具 - BLEUnlock
  2. uses-permission和permission区别及使用
  3. 「电子乐之父」的遗作还没完成?由人工智能接手?
  4. Python量化交易学习笔记(36)——backtrader多股回测避坑3
  5. 400呼叫中心过程概述
  6. nginx 负载均衡与反向代理
  7. 最好的创新,从来不靠领导
  8. CentoS 7 LNMP 环境部署zabbix监控
  9. oracle查询flashback,【oracle】闪回flashback-10g-flashback query
  10. 这是一个创业的时代《《《《