dispatch多方法实现连续动画

原创 2016年08月31日 13:04:05

起因:
【我相信大家见到代码比看文字清楚的多。里面的内容也比博客多。
附github链接:https://github.com/OPTJoker/SerialAnimations.git

最近在学习webGL,由于需要一个slider去控制webGL里面3D模型的一些属性,找的库又大有不好用,想自己封装一个模块,于是就开始了html和JS的学习之路。
然后就发现jquery的动画库那么强大,可以串行的执行连续动画。于是想在iOS中实现一下这种效果。
国内没找到什么好资料,有一个人在博客里分享了一种实现方法,不过他用的是关键帧动画,我觉得这种办法太笨,因为要根据动画的播完时间设置delay,那如果有1万个动画,你岂不是要算出1万个delay值?我就呵呵了。
传送门在这:http://www.devtalking.com/articles/uiview-keyframe-animation
在stackoverflow发现了不少干货。于是实现了连播效果,现在来分享一下。

方法一:通过dispatch的group来实现多动画串行执行。
stackoverflow传送门:http://stackoverflow.com/questions/27601758/how-to-use-gcd-to-control-animation-sequence
这个人的答案就是利用dispatch的group实现了多动画的连续播放。
关键代码:

@property (nonatomic, strong) dispatch_queue_t serialQueue;
@property (nonatomic, strong) dispatch_group_t group;

-(void)initQueue {
    // create a serial queue
    self.serialQueue = dispatch_queue_create("com.example.serialQueue", 0);
    // create a dispatch group
    self.group = dispatch_group_create();
}
-(void)animateSyncWithDuration:(NSTimeInterval)duration animations:(block_t)animations {
    dispatch_async(self.serialQueue, ^{
        /*
         * This block is invoked on the serial queue
         * This block would never be executed concurrently
         */

        /*
         * Enter the dispatch group
         */
        dispatch_group_enter(self.group);

        dispatch_async(dispatch_get_main_queue(), ^{
            /*
             * This block is invoked on the main queue
             * It is safe to use UIKit
             */
            [UIView animateWithDuration:duration animations:animations completion:^{
                /*
                 * This completion block is invoked on the main queue
                 * Now leave the dispatch group
                 */
                dispatch_group_leave(self.group);
            }];
        });

        /*
         * Wait until leaving the dispatch group from the UIView animation completion block
         * It means it blocks the serial queue
         */
        dispatch_group_wait(self.group, DISPATCH_TIME_FOREVER);
    });
}

上面的封装完成,就可顺序调用animateSyncWithDuration: animations:来执行动画了。
例:

[self animateSyncDuration:dur animations:^{
    [self changeWidth:ScreenW-40];
}];

[self animateSyncDuration:dur animations:^{
    [self changeHeight:260];
}];

[self animateSyncDuration:dur animations:^{
    [self changeCenter:CGPointMake(ScreenW/2.f, 2*ScreenH/5.f)];
}];

方法二:根据同步异步的性质,用dispatch实现连续动画
分析:既然要按顺序执行多个动画,那就用dispatch_sync先创建要多个同步线程,线程的block穿动画的block。然后把这多个同步线程顺序装进一个异步于main线程的线程来管理,岂不就达到了想要的效果嘛。
这个思路来自于之前做的一个效果:模仿开眼app下面让一段文字一个个逐渐刷出来的效果。
不罗嗦,上代码:
首先typedef一个动画的block类型:

typedef void(^animBlock)(void);

然后根据分析实现线程的逻辑:

- (void)anim:(NSArray *)animArr{
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        for (short i =0; i<animArr.count; i++) {
            dispatch_sync(dispatch_get_main_queue(), animArr[i]);
        }
    });
}

最后 创建动画数组

//基于异步文字思想的连播动画
- (void)asyncPlayFlash{
    NSMutableArray *animMArr = [[NSMutableArray alloc] initWithCapacity:0];

    animBlock chW = ^{[self changeWidth:ScreenW-40];};
    animBlock chH = ^{[self changeHeight:260];};
    animBlock chP = ^{[self changeCenter:CGPointMake(ScreenW/2.f, 2*ScreenH/5.f)];};

    [animMArr addObject:chW];
    [animMArr addObject:chH];
    [animMArr addObject:chP];

    [self anim:animMArr];
}

就BB这么多,我相信大家见到代码比看文字清楚的多。里面的内容也比博客多。
附github链接:https://github.com/OPTJoker/SerialAnimations.git

版权声明: 举报

相关文章推荐

dispatch多方法实现连续动画

起因: 【我相信大家见到代码比看文字清楚的多。里面的内容也比博客多。 附github链接:https://github.com/OPTJoker/SerialAnimations.git】最近在学...

九种原生js动画效果

在做页面中,多数情况下都会遇到页面上做动画效果,我们大部分做动画的时候都是使用框架来做(比如jquery),这里我介绍下如何让通过原生的js来实现像框架一样的动画效果! 1、匀速动画效果 说明:匀...

我是如何成为一名python大咖的?

人生苦短,都说必须python,那么我分享下我是如何从小白成为Python资深开发者的吧。2014年我大学刚毕业..

iOS 多线程编程gcd全面系统认识

这两天在看《OC高级编程-多线程编程和内存管理》日本人写的那本,该书对arc,block和gcd有了更深层次的解读,非常不错。现在总结一下gcd相关的知识。有关arc和block的参考arc 参考...

android的XML连续动画

首先把连续的图片放在drawable文件夹下,我准备的连续图片为nv1~nv4 并新建一个控制图片播放顺序及时间的XML文件,这里我命名为animation.xml: 然后编写animation....

动画连续播放

fragment_main.xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmln...

Android 连续的补间动画(Animation/Tween)

通过Animation监听事件实现连续动画创建一个简单的xml文件,里面有一个即可MainActivity.java:public class MainActivity extends Activit...

多线程实现不连续售票

实现一个由A、B、C三个窗口同时销售100张票的系统 1.  创建3个线程分别代表三个窗口(10分) 2.  三个窗口同时开始售票,要求打印出每个窗口打印的售票情况(10分) 3.  每个窗口不...

多种方法求最大连续和

最大连续和的定义:给出一个长度为n的序列A1,A2,...,An,求最大连续和,即找要求找到1     方法一,根据定义容易想到:         int maxSubSeqSum(int A[],i...

cocos2d-x帧动画实现(续)

猴子原创, 欢迎转载,转载请在明显处注明! 谢谢。 原文地址:http://blog.csdn.net/yanghuiliu/article/details/6933421 之前我介绍过coc...

cocos2d-x帧动画实现(续)

猴子原创, 欢迎转载,转载请在明显处注明! 谢谢。 原文地址:http://blog.csdn.net/yanghuiliu/article/details/6933421 之前我介绍过coc...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)