iOS:如何使用不同的混合模式为多个图像图层设置动画

时间:2016-08-02 18:40:40

标签: ios sprite-kit jquery-animate core-graphics calayer

首先是问题:我如何(在iOS中)使用不同的混合模式从图像创建多个图层,并独立地为图像设置动画(而不是渲染结果)。

我完全坚持这一点。我想绘制一些图像并为它们制作一点动画。只是一些旋转和缩放。图像图层应使用混合模式,如“颜色”和“颜色”。或者' SoftLight'。

这是我到目前为止所尝试的内容:

  1. CoreGraphics中
  2. 绘制所有内容并使用CADisplayLink创建动画循环。结果是非常糟糕的性能,但它看起来很棒:)这里的一些代码只是为了展示我如何使用混合模式:

        override public func draw(_ rect: CGRect) {
        super.draw(rect)
    
        let layer0 = UIImage(named:"ellipse_00")!
        layer0.draw(in: rect, blendMode: .screen, alpha: 0.5)
    
        let layer1 = UIImage(named:"ellipse_01")!
        layer1.draw(in: rect, blendMode: .softLight, alpha: 1)
        ...
    

    只要有一个渲染循环调用' setNeedsDisplay()'表现不见了。即使没有在更新方法中更改图像的位置。

    1. CALayers
    2. 使用CALayers动画效果很好,但iOS 10中似乎不支持过滤器,compositeFilter和backgroundFilter :(

          ellipse_00 = UIView(frame: self.bounds)
          ellipse_00.layer.backgroundColor = UIColor.black.cgColor
          ellipse_00.isOpaque = false
          ellipse_00.layer.contents = UIImage(named: "ellipse_00")!.cgImage!
          ellipse_00.layer.opacity = 1
          let filter = CIFilter(name: "CIScreenBlendMode")
          ellipse_00.layer.compositingFilter = filter
          self.addSubview(ellipse_00)
      
      1. GPUImage
      2. 我可以弄清楚如何正确地绘制这些东西,但是尝试动画会导致随机崩溃和很多挫折。

            private override func setupUI() {
                    super.setupUI()
        
                    background_image = GPUImagePicture(cgImage: UIImage(named: "black")?.cgImage)
                    ellipse_00_image = GPUImagePicture(cgImage: UIImage(named: "ellipse_00")?.cgImage)
        
                    // Define Filters
                    softLightFilter = GPUImageSoftLightBlendFilter()
        
                    // Define Filter Chain
                    softLightFilter.addTarget(gpuImageView)
        
                    // Process Images
                    background_image?.addTarget(softLightFilter)
                    ellipse_00_image?.addTarget(softLightFilter)    
            }
        
            override func updateUI() {
                    super.updateUI()
        
                    // Change position and rotate…
                    background_image?.processImage()
                    ellipse_00_image?.processImage()
            }
        
        1. SpriteKit
        2. 这似乎是2D动画制作动画的明显方法。我设法绘制和动画图层,但混合模式再次无效。 SKEffectNode的问题在于SKBlendMode仅限于一个小子集,并不能满足我的需求。

          这是我想要做的一个例子。在这张照片中是黑色背景上的3个椭圆。应该旋转和挤压椭圆(如果正确的话,它应该产生非常有机的效果:P)。混合模式是"添加"和两次"柔和的光线"。这只是我正在做的更大事情的一部分...

          result

0 个答案:

没有答案