ChatBubble动画

作者: 微微笑的蜗牛 | 来源:发表于2016-05-06 18:44 被阅读213次

前言

最近看了一个动画的实现,觉得比较有意思,就自己重新实现了一下。效果图如下。

chatBubbleAnimation.gif

动画看起来比较简单,就是3个点在做position,scale,opacity的组合动画。

主要是3个点的实现。最直接的,可以用3个view来写。然后自己控制动画间隔。看了作者的实现,觉得这个思路比较好,就是用CAReplicatorLayer。它对图层进行copy,并且可设置个数,图层之间的变换,动画延迟时间等等。

然后用到了@IBDesignable,可以在xib中直接看效果。@IBInspectable,在inspector中设置属性值。

Paste_Image.png

CAReplicatorLayer

The CAReplicatorLayer class creates a specified number of copies of its sublayers (the source layer), each copy potentially having geometric, temporal and color transformations applied to it.

CAReplicatorLayer 从源图层中copy出多个图层,并且可以对这些图层进行一系列的颜色,位置的变换。

...

// 设置图层个数
replicatorLayer.instanceCount = 3
// 设置图层变换,这里是每个图层直接的x间隔
replicatorLayer.instanceTransform = CATransform3DMakeTranslation(dotSize() * 1.6, 0, 0)
// 动画间隔时间
replicatorLayer.instanceDelay = 0.1

dotLayer = CALayer()
dotLayer.bounds = CGRectMake(0, 0, dotSize(), dotSize())
dotLayer.position = CGPointMake(center.x - dotSize() * 1.6, center.y + dotSize() * 0.2)
dotLayer.cornerRadius = dotSize() / 2
dotLayer.backgroundColor = dotColor.CGColor

replicatorLayer.addSublayer(dotLayer)

CAReplicatorLayer还有一些其他的属性。颜色值,透明度的设置等。


public var instanceColor: CGColor?
    
    /* The color components added to the color of instance k-1 to produce
     * the modulation color of instance k. Defaults to the clear color (no
     * change). Animatable. */
    
    public var instanceRedOffset: Float
    public var instanceGreenOffset: Float
    public var instanceBlueOffset: Float
    public var instanceAlphaOffset: Float


进一步学习可参考:
http://www.ios-animations-by-emails.com/posts/2015-march#tutorial
https://zsisme.gitbooks.io/ios-/content/chapter6/careplicatorLayer.html
http://tuohuang.info/14.html#.VysQ0ZN95Gw

动画实现

气泡最外层的路径,是个贝塞尔曲线,用PaintCode生成,拖一下形状,就会自动转换成代码,比较方便。
上面说过,跳动的3个点的动画是组合动画,了解过组合动画的应该觉得它比较简单了。position.y, scale, opacity的组合。

这里我将动画的生成单独抽出到AnimationHelper,各司其职,减少耦合。

let move = AnimationHelper.createAnimation(.yPosition, fromValue: dotLayer.position.y, toValue: dotLayer.position.y - dotSize(), duration: 0.5)

let alpha = AnimationHelper.createAnimation(.opacity, fromValue: 1, toValue: 0, duration: 0.5)

let scale = AnimationHelper.createAnimation(.scale, fromValue: 1, toValue: 1.3, duration: 0.5)

let animationGroup = AnimationHelper.animationGroup(0.5, name: "up", animations: [move, alpha, scale])
animationGroup.delegate = self
dotLayer.addAnimation(animationGroup, forKey: "dotAniamtion")
        

在向上跳动的动画结束之后,会进行一个向下的动画,动画类似,只是值反过来了。如此往复。

override func animationDidStop(anim: CAAnimation, finished flag: Bool) {
        if let value = anim.valueForKey("animation") as? String {
            if value == "up" {
                animationEnd()
            } else if value == "down" {
                animationStart()
            }
        }
    }
    

具体代码实现:https://github.com/silan-liu/ChatBubbleAnimation

相关文章

  • ChatBubble动画

    前言 最近看了一个动画的实现,觉得比较有意思,就自己重新实现了一下。效果图如下。 动画看起来比较简单,就是3个点在...

  • Android回顾--(十六) 动画简析

    动画: 补间动画(Tween动画) 帧动画(Frame动画) 属性动画(Property动画) 补间动画 特点: ...

  • 在山西太原,做个二维动画需要哪些制作流程?

    二维动画有哪些类型? flash动画,课件动画,mg动画,ae动画,GIF动画,手绘动画,网页动画,企业动画,宣传...

  • Android 动画

    【Android 动画】 动画分类补间动画(Tween动画)帧动画(Frame 动画)属性动画(Property ...

  • 动画学习

    动画 分为 组动画,属性动画,渐变动画,其中属性动画包括 普通动画和关键帧动画,其他动弹动画,动画层分为 pres...

  • Android动画

    Android动画分类: 视图动画:补间动画、逐帧动画 属性动画 视图动画 补间动画 可以在xml中定义动画,然后...

  • iOS动画

    iOS动画-从UIView动画说起iOS动画-Transform和KeyFrame动画iOS动画-layout动画...

  • Android动画之视图动画

    分类 Android动画主要包括视图动画和属性动画。视图动画包括Tween动画和Frame动画。Tween动画又包...

  • Android 动画

    android动画分为三种 帧动画,视图动画(补间动画),属性动画逐帧动画 视图动画 属性动画 Window和A...

  • android动画

    动画: 分类:分为视图动画和属性动画,其中视图动画又分为补间动画和逐帧动画。补间动画又分为平移动画、缩放动画、旋转...

网友评论

    本文标题:ChatBubble动画

    本文链接:https://www.haomeiwen.com/subject/rtujrttx.html