原文链接:http://kittenyang.com/drawablebubble/,博主年轻却很有思想。相仿的年纪,很佩服他!

首先分析拖拽时的图,大圆、不规则的图(实际上时有规律的不然也画不出来,这里只是代指)、小圆。对,拖拽时的效果就是这三部分拼凑成的。博主 大圆用了UIView 不规则的图 用CAShapeLayer ,小圆也是UIView,在我自己实现时,发现其实大圆用UIView,小圆和中间那部分 用CAShapeLayer就能画出来了。CAHShapeLayer 都知道给它传一个path,它就能根据path生成任意形状的layer。所以后面其实就是用贝塞尔曲线构建这个path,这个path构建对于我这种被大学上了四年的人来说,没有前人的基础,估计打死也没有这种想法。

下面就是 构建 A、B、C、D、O、P 这六个点,创建path,给CAShapeLayer,生成layer。

下面时部分代码:

处理手势的

/** 处理手势 */
- (void)panGesture:(UIPanGestureRecognizer *)gesture {
// self.containerView bubbleView 的父视图
CGPoint newCenter = [gesture locationInView:self.containerView]; self.bubbleView.center = newCenter; if (gesture.state == UIGestureRecognizerStateBegan) { // 手势开始 移除动画
[self.bubbleView.layer removeAllAnimations]; }else if (gesture.state == UIGestureRecognizerStateChanged) { // 圆心距离 >= 断裂的距离
if (centerDistance >= self.maxDistance ) { // 大于设定的值时 断裂 移除shapeView
[self.shapeLayer removeFromSuperlayer]; }else { // 更新 贝塞尔曲线shapeView 的形状
[self updateCoordinate:newCenter];
} }else if (gesture.state == UIGestureRecognizerStateCancelled || gesture.state == UIGestureRecognizerStateEnded || gesture.state == UIGestureRecognizerStateFailed) { // 大于 设定值 并且实现了 block,执行block
if (centerDistance >= self.maxDistance && self.breakComplete) {
self.breakComplete();
}else { // 让小球回到 初始点
[UIView animateWithDuration:0.5 delay: usingSpringWithDamping:0.4 initialSpringVelocity: options:UIViewAnimationOptionCurveEaseInOut animations:^{
self.bubbleView.center = initBubbleCenter;
} completion:^(BOOL finished) {
// 小球回到初始点 圆心距离归零
centerDistance = ; if (finished && self.achieveAnimation) {
[self animationForBubbleView];
} }]; } [self.shapeLayer removeFromSuperlayer]; }
}

手势的拖拽导致大圆中心点更新,以此更新A、B、C、D、O、P六个点,跟新path,对于CAShapeLayer来说,你传给他一个新的path,它就会更新它的形状

/** 根据新的中心点 更新 ABCDOP6个点 以更行CAShapeLayer 的path */
- (void)updateCoordinate:(CGPoint)currentCenter { CGFloat x2 = currentCenter.x;
CGFloat y2 = currentCenter.y;
CGFloat x1 = initBubbleCenter.x;
CGFloat y1 = initBubbleCenter.y; // 当前圆心 于 初始点圆心距离
centerDistance = sqrt((x2-x1) * (x2-x1)+(y2-y1)*(y2-y1)); // 更新初始化圆心处 圆的半径(随着拖拽的距离的增大而减小,达到设定的距离 消失) if (centerDistance == ) {
cos = ;
sin = ;
}else{
cos = (y2-y1) / centerDistance;
sin = (x2-x1) / centerDistance;
}
r1 = r2 * ( - (centerDistance / self.maxDistance) * self.modulus); A = CGPointMake(x1 - r1*cos, y1 + r1*sin);
B = CGPointMake(x1 + r1*cos, y1 - r1*sin);
C = CGPointMake(x2 + r2*cos, y2 - r2*sin);
D = CGPointMake(x2 - r2*cos, y2 + r2*sin); O = CGPointMake(A.x + centerDistance / 2.0*sin, A.y + centerDistance / 2.0 * cos);
P = CGPointMake(B.x + centerDistance / 2.0*sin, B.y + centerDistance / 2.0*cos);
UIBezierPath *path = [UIBezierPath bezierPathWithArcCenter:initBubbleCenter radius:r1 startAngle: endAngle:M_PI * clockwise:]; UIBezierPath *path1 = [UIBezierPath bezierPath];
[path1 moveToPoint:A];
[path1 addLineToPoint:B];
[path1 addQuadCurveToPoint:C controlPoint:P];
[path1 addLineToPoint:D];
[path1 addQuadCurveToPoint:A controlPoint:O];
[path appendPath:path1]; self.shapeLayer.path = path.CGPath; }

完整代码:http://pan.baidu.com/s/1dEzZLst

QQ中未读气泡拖拽消失的实现(参照一位年轻牛B的博主的思路自己实现了一下)的更多相关文章

  1. reactnative实现qq聊天消息气泡拖拽消失效果

    前言(可跳过) 我在开发自己的APP时遇到了一个类似于qq聊天消息气泡拖拽消息的需求,因为在网上没有找到相关的组件,所以自己动手实现了一下 需求:对聊天消息气泡拖拽到一定长度松开时该气泡会消失(可自行 ...

  2. QQ去除未读状态的动画

    QQ去除未读状态的动画 by 伍雪颖 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcmFpbmxlc3Zpbw==/font/5a6L5L2T/fonts ...

  3. HTML5中的对象的拖拽

    拖拽: draggable="true"页面上就能实现拖拽事件: ondragstart 拖拽开始事件 ondrag 拖拽中 ondragend 拖拽结束事件 投放区事件: ond ...

  4. openlayers中实现点的拖拽(modify),在layer中增加修改删除point。

    最近忙着整地图,都忘记了总结来沉淀自己,自我检讨一下. 总结一下最近使用openlayer时学习的内容,先说下我的业务逻辑吧,在室内地图中 1,点击新增在地图上新增一个可以拖拽的点,拖拽完成后确定位置 ...

  5. winform中文本框添加拖拽功能

    对一个文本框添加拖拽功能: private void txtFolder_DragEnter(object sender, DragEventArgs e) { if (e.Data.GetDataP ...

  6. 一个类似于QQ语音聊天时的拖拽移动悬浮小球

    闲来无事,分享一个最近在某个地方借鉴的一个demo(原谅我真的忘了在哪里看到的了,不然也就贴地址了)这个demo的逻辑思路并不是很难,推敲一下,很快就能理解,只是觉得这样的一个组合控件用起来蛮能增色自 ...

  7. Android中的ScrollView实现 拖拽反弹效果

    public class BounceScrollView extends ScrollView { private View inner;// 孩子View private float y;// 点 ...

  8. HTML/CSS: 如何制作未读信息图标

    最近公司项目中涉及到制作通讯界面中未读信息的带数字的红色圆点图标. 拿我目前的博客头像图片为例(其实就是谷歌图片中粗略挑了一张顺眼的图片),效果图如下: HTML代码如下: <img id=&q ...

  9. wing带你玩转自定义view系列(2) 简单模仿qq未读消息去除效果

    上一篇介绍了贝塞尔曲线的简单应用 仿360内存清理效果 这一篇带来一个  两条贝塞尔曲线的应用 : 仿qq未读消息去除效果. 转载请注明出处:http://blog.csdn.net/wingicho ...

随机推荐

  1. .net简单页面后台绑定下拉框,按钮,分页 后台cs文件

    二.cs文件 using System;using System.Collections.Generic;using System.Web.UI;using System.Web.UI.WebCont ...

  2. unity——使用角色控制器组件+射线移动

    首先要导入unity标准资源包Character Controllers 这个标准资源包,为了方便,还添加了两外一个资源包Scripts,后者包含了一些基本的脚本个摄像机脚本. 没错,这次我们要使用其 ...

  3. MySQL在Linux系统下配置文件详解

    在日常的的开发过程中接触到了SQLServer和MySQL数据库的操作性问题,可能是以前接触的都是SQL Server,才开始接触MySQL,总感觉使用MySQL没有使用SQLserver那么顺手,一 ...

  4. onsubmit提交前先验证(验证不通过阻止form提交)

    <form  onsubmit = "return val();"> <input type="submit" value="提交& ...

  5. CSS凹型导航按钮

    一般需求,圆角看起来更加舒服,但是下面直角略显生硬 于是设计师有了下面的需求,下面加上小凹型: 凹型?凹型?凹型?有点变态,这怎么实现........... 图片肯定是最先考虑到的,CSS实现有貌似有 ...

  6. hdu4497 正整数唯一分解定理应用

    C - (例题)整数分解,计数 Crawling in process... Crawling failed Time Limit:1000MS     Memory Limit:65535KB    ...

  7. USB联机线编程接口(API)

    USB联机线编程接口(API) 2013-10-19 本页面的文字允许在知识共享 署名-相同方式共享 3.0协议和GNU自由文档许可证下修改和再使用. 关键字:USB隔离线.USB点对点通讯.USB通 ...

  8. 双人贪吃蛇小游戏C++原创

    大家好,我是小鸭酱,博客地址为:http://www.cnblogs.com/xiaoyajiang /*贪吃蛇*/ #include<stdio.h> #include<time. ...

  9. Unity3D中使用KiiCloud总结一

    Kii Cloud简介 Kii Cloud提供一系列的服务,来帮助你为你的App获取用户,留住用户,以及创造利润.它为移动App提供了用户管理以及快捷安全可扩展的数据存储服务. 现在你可以在短短几分钟 ...

  10. C语言开发CGI程序的简单例子

    这年头用C语言开发cgi的已经不多,大多数的web程序都使用java.php.python等这些语言了. 但是本文将做一些简单的cgi实例. 首先配置环境 #这里是使用的apache AddHandl ...