初识Android自定义控件之旋转罗盘的制作
话说有时候心血来潮,想到一个点子自己又感兴趣就会迫不及待的去做,在简单了解了安卓的事件派发机制之后,想做一个控件,
实现这样的效果:根据手滑动屏幕的速度和方向,让图片转动起来,并且持续时间和速度有关,转的圈数和时间有关,最后慢慢停下来,这个图模拟器上截的不是很好
实现思路:
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自定义控件之旋转罗盘的制作相关推荐
- android 旋钮控件,Android自定义控件 温度旋转按钮
封面 1.介绍 首先看下效果图 温度旋转按钮 2.思路 初始化一些参数 绘制刻度盘 绘制刻度盘下的圆弧 绘制标题与温度标识 绘制旋转按钮 绘制温度 处理滑动事件 提供一些接口方法 3.实现 初始化一些 ...
- 初识Android 制作一个简单的记账本
初识Android 制作一个简单的记账本 主要功能 实现一个记账本页面 可以添加数据并更新到页面中 主要步骤 运行截图 主页面 点击红色按钮弹出添加页面 完成后自动更新到目录下 主要功能 实现一个记账 ...
- Android自定义控件进阶03-Canvas之画布操作
Android自定义控件进阶03-Canvas之画布操作 本来想把画布操作放到后面部分的,但是发现很多图形绘制都离不开画布操作,于是先讲解一下画布的基本操作方法. 一.Canvas的常用操作速查表 操 ...
- android自定义view获取控件,android 自定义控件View在Activity中使用findByViewId得到结果为null...
转载:http://blog.csdn.net/xiabing082/article/details/48781489 1. 大家常常自定义view,,然后在xml 中添加该view 组件..如果在 ...
- android汽车之家顶部滑动菜单,Android自定义控件之仿汽车之家下拉刷新
关于下拉刷新的实现原理我在上篇文章Android自定义控件之仿美团下拉刷新中已经详细介绍过了,这篇文章主要介绍表盘的动画实现原理 汽车之家的下拉刷新分为三个状态: 第一个状态为下拉刷新状态(pull ...
- Android自定义控件之仿汽车之家下拉刷新
感谢 阿拉灯神灯 的技术分享 .版权声明:原文来自http://blog.csdn.net/nugongahou110 关于下拉刷新的实现原理我在上篇文章Android自定义控件之仿美团下拉刷新中已经 ...
- Android自定义控件之自定义时钟
Android自定义控件之自定义时钟 这个是我从别的开源项目中挖出来的,真心写的很不错,然后继续下来以便不时之需,直接上代码: WatcherBoard.java这个是自定义的时钟类 package ...
- android自定义波浪图,Android自定义控件--波浪图控件
今天给大家分享一个android的波浪图控件制作.具体效果如下图所示: 上次有个app使用了这个控件,感觉特别酷炫.今天讲解一下这个控件的思路分析与代码编写. 思路分析: 1.绘制波浪图 2.移动波浪 ...
- Android自定义控件三部曲文章索引
前言:在我从C++转到Android时,就被Android里炫彩斑斓的自定义控件深深折服,想知道如果想利用C++实现这些功能,那是相当困难的.从那时候起,我就想,等我学会了自定义控件,一定要写一篇系列 ...
最新文章
- Scikit-Learn大变化:合并Pandas
- 求求你,别在 MySQL 中使用 UTF-8了!
- 模板 -基础数据结构
- 一条命令monkey命令
- 【Python刷题】_1
- TopLink JPA
- axure如何页面滑动时广告位上移_Axure案例:滑动输入,学会这一招,你就能超越80%的人...
- python 实现冒泡排序
- 五款常见的bt磁力下载软件
- 绘画和照片编辑:Artstudio Pro for mac
- en结尾的单词_形容词加en前后缀变动词的英语单词
- 比赛对阵表(女排世界杯对阵表)
- 数学三次危机(四)第一次数学危机
- 关于华为昆仑关键业务服务器
- Java基础入门:IDEA软件安装和软件初始化设置
- 蛋白质相互作用位点标签的获取方法
- 《Spring响应式微服务》读书笔记
- React | React的JSX语法
- NDK编译时NDK_PROJECT_PATH = null
- 阿基米德优化算法AOA附Matlab代码