QQ去除未读状态的动画

by 伍雪颖

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcmFpbmxlc3Zpbw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">


- (void)drawRect:(CGRect)rect
{

    switch (_state) {

        case
SRSlimeStateNormal:

        {

            float percent =
1 -
distansBetween(_startPoint ,
_toPoint) /
_viscous;

            if (percent ==
1) {

                CGContextRef context =
UIGraphicsGetCurrentContext();

                UIBezierPath *path = [UIBezierPath
bezierPathWithRoundedRect:CGRectMake(_startPoint.x
- _radius,
_startPoint.y -
_radius,
2*_radius,
2*_radius)

                                                                cornerRadius:_radius];

                [self
setContext:context
path:path];

                CGContextDrawPath(context,
kCGPathFillStroke);

            }else {

                CGFloat startRadius =
_radius * (kStartTo + (1-kStartTo)*percent);

                CGFloat endRadius =
_radius * (kEndTo + (1-kEndTo)*percent);

                CGContextRef context =
UIGraphicsGetCurrentContext();

               

                UIBezierPath *path = [self
bodyPath:startRadius

                                                end:endRadius

                                            percent:percent];

                [self
setContext:context
path:path];

                CGContextDrawPath(context,
kCGPathFillStroke);

                if (percent <=
0) {

                    _state =
SRSlimeStateShortening;

                    [self
scaling];

                }

            }

        }

            break;

        case
SRSlimeStateShortening:

        {

            _toPoint =
CGPointMake((_toPoint.x
- _startPoint.x)*0.8
+ _startPoint.x,

                                       (_toPoint.y -
_startPoint.y)*0.8
+ _startPoint.y);

            float p =
distansBetween(_startPoint,
_toPoint) /
_viscous;

            float percent =1 -p;

            float r =
_radius * p;

           

            if (p >
0.01) {

                CGFloat startRadius = r * (kStartTo + (1-kStartTo)*percent);

                CGContextRef context =
UIGraphicsGetCurrentContext();

               

                CGFloat endRadius = r * (kEndTo + (1-kEndTo)*percent)
* (1+percent /
2);

                UIBezierPath *path = [self
bodyPath:startRadius

                                                end:endRadius

                                            percent:percent];

                [self
setContext:context
path:path];

                CGContextDrawPath(context,
kCGPathFillStroke);

            }else {

                self.hidden =
YES;

                _state =
SRSlimeStateMiss;

            }

        }

            break;

        default:

            break;

    }
}


QQ去除未读状态的动画的更多相关文章

  1. QQ中未读气泡拖拽消失的实现(参照一位年轻牛B的博主的思路自己实现了一下)

    原文链接:http://kittenyang.com/drawablebubble/,博主年轻却很有思想.相仿的年纪,很佩服他! 首先分析拖拽时的图,大圆.不规则的图(实际上时有规律的不然也画不出来, ...

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

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

  3. MailKit---如何知道文件夹下有多少封未读邮件

    如果在mailkit中,文件夹已经选中并打开了的话,那直接使用ImapFolder.Unread属性就可以获取到有多少封未读邮件了. 如果文件夹没有打开,那么你还可以使用查询状态的方法来获取未读状态的 ...

  4. 解决QQ未启用状态,QQ留言图标未启用

    最近由于腾讯升级QQ一些东西,导致QQ图标成未启用状态:如图 解决方法,到腾讯此站点登陆一下即可, http://wp.qq.com/set.html 另外设置 没有保存按钮,如果选择完全公开,到自己 ...

  5. Android 高仿QQ滑动弹出菜单标记已读、未读消息

    在上一篇博客<Android 高仿微信(QQ)滑动弹出编辑.删除菜单效果,增加下拉刷新功能>里,已经带着大家学习如何使用SwipeMenuListView这一开源库实现滑动列表弹出菜单,接 ...

  6. android 实现类似qq未读消息点击循环显示

    public void jumpUnread(boolean cycle) { List<ContactLogModel> dataList = adapter.getContactLog ...

  7. iOS 未读消息角标 仿QQ拖拽 简单灵活 支持xib(源码)

    一.效果 二.简单用法 超级简单,2行代码集成:xib可0代码集成,只需拖一个view关联LFBadge类即可 //一般view上加角标 _badge1 = [[LFBadge alloc] init ...

  8. android 项目学习随笔十三(ListView实现ITEM点击事件,将已读状态持久化到本地)

    1.因为给LISTVIEW增加了两个头布局,所以在点击事件ITEM索引会增加2,比如原来第一条数据的索引应该为0,增加两个头布局后,它的索引变为        2,为了使LISTVIEW的ITEM在点 ...

  9. 一种读取Exchange的用户未读邮件数方法!

    已好几个月没写博客了,由于之前忙于开发基于Sharepoint上的移动OA(AgilePoint)和采用混合移动开发技术开发一个安卓版的企业通讯录APP(数据与lync一致),并于1月初正式上线.马年 ...

随机推荐

  1. gitminer

    https://github.com/UnkL4b/GitMiner + Autor: UnK + Blog: https://unkl4b.github.io + Github: https://g ...

  2. Paint Fence

    There is a fence with n posts, each post can be painted with one of the k colors.You have to paint a ...

  3. SharePoint 2013 另一个程序正在使用此文件,进程无法访问。 (异常来自 HRESULT:0x80070020)

    环境:SharePoint 2013 + Windows Server 2012 R2 在管理中心新建一个Web Application,端口为:88.顺利创建网站集后,打开访问却提示:无法显示此页 ...

  4. vs 连接过程报错 dll 分析 ------- DLL动态链接库

    1:编译成功,说明代码没有问题了2:连接报错,说明 exe 在查找dll 的入口地址过程,找不到合适的信息,这些信息保存在 dll 对应的 *.lib 文件里面  说明:exe如果生成成功了lib 这 ...

  5. Java基础91 mysql的用户权限设置问题

    1.概述 1)MySQL数据库中root用户具有最高的权限(超级用户),可以对任何数据库,任何表进行操作. 2)权限账户,只拥有部分权限(CRUD) .例如:只能操作某个数据库的某张表等等. 2.my ...

  6. 掩膜 rcnn

    更多讨论,参考知乎:https://www.zhihu.com/question/57403701

  7. finall和set和构造方法的参数意义

    package demo04; /* * 形状 */public abstract class Shape { // 求周长 public abstract double getGrith(); // ...

  8. for-in循环(for-in Loops)

    for-in循环应该用在非数组对象的遍历上,使用for-in进行循环也被称为“枚举”. 从技术上将,你可以使用for-in循环数组(因为JavaScript中数组也是对象),但这是不推荐的.因为如果数 ...

  9. C语言:指针实现交换两个变量的值

    用指针交换两个变量的值(10分) 题目内容: 用指针交换两个变量的值 主函数参考: int main( ) { int a,b; scanf("%d%d",&a,& ...

  10. vue后台管理框架

    vue后台管理框架 系列教程<一步步带你做vue后台管理框架>第一课 github地址:vue-framework-wz 线上体验地址:立即体验 在如今的科技公司中有很多前端的需求都是要写 ...