Android自定义View-模仿QQ的拖拽气泡






第一步:明白气泡的几个状态
1.默认状态[STATE_DEFAULT]
2、拖拽状态[STATE_DRAG](要回弹的情况):
可能产生拖拽状态的几个情形:
(1)移动的距离较小<某一个值(比如半径的2倍+一个偏移值)
(2)移动到最大的一个限度值(比如最大的限度值+-一个偏移值)
3、移动状态[STATE_MOVE]
当移动的距离值>可移动的最大限度值
4、消失状态[STATE_DISMISS]
移动之后就是消失了。

第二步:明白大概的思路
不用思考,肯定使用到了贝赛尔曲线:

第三步:初始化组价的属性,并计算组件的大小
这些基础就不用说了,需要的属性有,气泡的半径大小,气泡的颜色,气泡字体的颜色,以及最大拖拽距离{在大于这个值得时候就是拖动了}等等。
自定义属性:


计算组件的大小:

第四步:通过点击,拖动,取消,分别获取到两点之间的距离,然后得到组件的各个状态
在处理之前说明一下:假设组件放在ListView或者RecyclerView的列表上面,要记得拦截父控件的点击事件:
getParent().requestDisallowInterceptTouchEvent(true);

点击的时候:首先明白在不可见的时候是不可以点击的
否则计算出当前手指的位置和起始点的坐标值,当拖动的距离在一个比较小的范围内,说明是在拖动的

拖动的时候:当不是在默认的情况下,计算出当前拖动的点和起始点的距离从而得到拖动的距离,当拖动的距离小于最大的距离的时候:
也是出于拖拽状态,但是此时起始点的半径应该逐渐变小;
相反出于拖动状态

手指抬起的时候:
当出于拖拽状态的时候,就弹回原来的位置
当处于移动状态,但是移动的位置最后却在起始点的位置附近,也弹回原来的位置
否则:让组件消失
第五步:绘制图像
1、如果状态不是消失,那么久绘制拖动气泡(即右上角的那个圆形)


2、如果处于拖拽状态,那么久绘制贝塞尔曲线

(1)得到控制点的坐标

(2)分别得到上述两个圆周围相切的四个点的坐标值【使用图中的公示】
(3)绘制贝塞尔曲线的路径(主要要闭合哦)

3、绘制文字

第六步、使用属性动画写组件处于拖拽状态弹回原始位置的估值器

此处使用的物理运动的插值器【BounceInterpolater】,这个插值器,是相当于物理运动,掉落了,又弹回来,又掉落,直到到的最后的位置。
1、估值器
它的作用就是将mBubbleCenterX,mBubbleCenterY逐渐移动到mCenterX,mCenterY;
2、复原动画
第七步、写组件消失动画(放大+透明度)


第八步、添加接口和方法



项目地址:








猜你喜欢

转载自blog.csdn.net/qq_32400821/article/details/79003726