自定义View之大风车系列demo(二)

版本1.0和版本2.0的风车有个不尽人意的效果:当手指抬起的时候风车就会停止转动,现在版本3要做的就是让手指抬起的时候让风车继续转动一段时间,思路如下:

1)手指抬起的时候继续让风车转动5秒

2)需要监听MotionEvent.ACTION_UP事件并记录手指抬起的时间upTime

3)捕获MotionEvent.ACTION_UP事件并重绘五秒钟

根据上面的说明RotationView的代码做了如下的改变(在版本2的基础上主要修改了onTouchEvent事件:

        /**手指抬起的时间**/
      private long upTime = 0;
    /**手指抬起的时候风车持续转动的时间**/
    private final long stopTimeDuration = 5000;
        @Override
	public boolean onTouchEvent(MotionEvent event) {
		int action = event.getAction();
		switch (action) {
		case MotionEvent.ACTION_MOVE:// 随着手指的move而不断进行重绘
			//该方法在UI线程自身中使用
			postInvalidate();
			break;
		case MotionEvent.ACTION_UP:// 随着手指的move而不断进行重绘
			upTime = System.currentTimeMillis();
			post(new Runnable() {
				@Override
				public void run() {
					long duration = System.currentTimeMillis()-upTime;
					if(duration ==stopTimeDuration ) {
						return;
					}else if(duration<stopTimeDuration) {
						post(this);
					}
					//在非UI线程中使用。
					invalidate();
				}
			});

			break;
		}
		return true;
	}

当然这个版本的风车还是有问题:风车转动的速度是一致的,不会随着手指移动的快慢而变化,这个将在下一个版本解决,详见自定义View之大风车系列(三)

时间: 2024-08-01 22:44:03

自定义View之大风车系列demo(二)的相关文章

自定义View之大风车系列demo(一)

每次写博客最讨厌写博客的开头,不知道该写些什么,现在也是,感觉跟写八百字作文似的.之所以会写这一系列的demo是因为前天看网上的一个图片转圈的源码的时候 突发奇想要不要自己也弄个耍耍,顺便学习下view的相关知识!说干就干,当然自己写的时候也不免参照写别人得到代码,毕竟自定义view与我的水平来说确实具有挑战性,通过完成这一些列的小demo确实收获颇多,虽然还有些许在我看来更牛逼的功能自己没法实现,但自己的目的也算达到了.先啰嗦了这么多,先说说大风车系列小demo的总体概况:一共五个版本,这也意

自定义View之大风车系列demo(三)

大风车系列版本1.0到版本3.0的体验有很大的不足:风车旋转的弧度都是手动写死的,不会根据手指移动的快慢而快慢.版本4.0将解决这个问题,思路如下: 1)以风车图片的中心为坐标原点简历一个直角坐标系,捕获手指按下事件也即是MotionEvent.ACTION_DOWN事件,记录此时手指的坐标点与直角坐标系x正坐标轴的夹角 2)获取手指移动的时候当前手指坐标点与直角坐标系x正轴的夹角. 3)计算步骤1和步骤2的两个夹角的差,就是手指此时移动的弧度.而不像版本3.0之前的那样写死了 具体代码设计如下

自定义View之大风车系列demo(四)

版本4.0有个问题当手指抬起的时候风车停止了,现在就解决这个问题,手指抬起的时候继续让风车由于惯性而继续旋转一段时间.思路如下 1)需要获取手指抬起时风车转动的瞬间速度,这个难度不小,在我的demo里面我只是简单的计算了手指按下到抬起经过的时间和弧度差,用弧度差除以时间来模拟下速度. 具体的还真不好用语言描述,所以偷个懒,直接上代码吧速度控制器添加了speed变量,并根据弧度差和经过的时间来计算速度 package rotation.demo.bean; import android.util.

自定义View之案列篇(三):仿QQ小红点

光棍节快到了,提前祝愿广大的单身猿猴,早日脱单,尽快找到另一半. 一直觉得 QQ 的小红点非常具有创新,新颖.要是自己也能实现类似的效果,那怎一个爽字了得. 先来看看它的最终效果: 效果图具有哪些效果: 在拉伸范围内的拉伸效果 未拉出拉伸范围释放后的效果 拉出拉伸范围再拉回的释放后的效果 拉出拉伸范围释放后的爆炸效果 涉及的相关知识点: onLayout 视图位置 saveLayer 图层相关知识 Path 的贝赛尔曲线 手势监听 ValueAnimator 属性动画 一.拉伸效果 我们先来讲解

自定义View之绘图篇(四):baseLine和FontMetrics

乐观是一首激昂优美的进行曲,时刻鼓舞着你向事业的大路勇猛前进.--大仲马 相关文章: 自定义View之绘图篇(一):基础图形的绘制 自定义View之绘图篇(二):路径(Path) 自定义View之绘图篇(三):文字(Text) 了解baseLine和FontMetrics有助于我们理解drawText()绘制文字的原理,下面我们一起来看看呗. 一.baseLine 基线 记得小时候练习字母用的是四线格本,把字母写在四线格内,如下: 那么在canvas中drawText绘制文字时候,也是有规则的,

自定义View之绘图篇(三):文字(Text)

顺境也好,逆境也好,人生就是一场对种种困难无尽无休的斗争,一场以寡敌众的战斗.--泰戈尔 相关文章: 自定义View之绘图篇(一):基础图形的绘制 自定义View之绘图篇(二):路径(Path) 一.文字 相关方法预览: //普通设置 paint.setAntiAlias(true); //指定是否使用抗锯齿功能 如果使用会使绘图速度变慢 默认false setStyle(Paint.Style.FILL);//绘图样式 对于设文字和几何图形都有效 setTextAlign(Align.LEFT

Android自定义View(二)

前言 魅族手机的闹钟应用中有个倒计时,这个控件还是蛮有趣的.左边是魅族闹钟,右边是我们最终实现的效果,虽然有些细节还需优化,不过基本上已经达到了想要的效果,我们先来就来看看如何实现吧. 分析 确定宽高 对一个Android自定义控件来说,一般都经过三个步骤 onLayout() onMeasure() onDraw() onLayout明确子控件在父控件中的位置(本控件不需要重写),onMeasure是确定控件的大小(宽.高),而onDraw是我们重点关注的方法,我们需要在这个方法中写入显示Vi

自定义View(二)--继承自ViewGroup

自定义View包括很多种,上一次随笔中的那一种是完全继承自View,这次写的这个小Demo是继承自ViewGroup的,主要是将自定义View继承自ViewGroup的这个流程来梳理一下,这次的Demo中自定义了一个布局的效果,并且这个自定义布局中包含布局自己的属性,布局中的控件也包含只属于这个布局才具有的自定义属性(类似于layout_weight只存在于LinearLayout中,只有LinearLayout中的控件可以使用一样).话不多说,先看效果图: 其中红色的部分是自定义的ViewGr

自定义View系列教程07--详解ViewGroup分发Touch事件

自定义View系列教程01–常用工具介绍 自定义View系列教程02–onMeasure源码详尽分析 自定义View系列教程03–onLayout源码详尽分析 自定义View系列教程04–Draw源码分析及其实践 自定义View系列教程05–示例分析 自定义View系列教程06–详解View的Touch事件处理 自定义View系列教程07–详解ViewGroup分发Touch事件 PS:如果觉得文章太长,那就直接看视频吧 在上一篇中已经分析完了View对于Touch事件的处理,在此基础上分析和理