iOS와 Android에서 이미지를 빛내는 연출 구현 비교

iOS판으로 만든 애니메이션 연출을 Android판에 이식했으므로, 그 때를 비망록으로서 남깁니다.

iOS 버전의 완제품




※gif라면 애니메이션 완료의 대기도 하고 있습니다만, 이 기사에서는 빛난 화상의 생성과 단체의 애니메이션의 실장 방법만 씁니다.
※Android판은 gif를 준비하고 있지 않습니다만, 거의 같습니다. 차이에 대해서는 마지막으로.

애니메이션 실행의 흐름



완성품의 gif에서는 이하의 처리를 실시하고 있습니다.
  • 일반 이미지 배치
  • 일반 이미지를 가공하여 빛나는 이미지를 생성합니다
  • ↑에서 생성 된 빛나는 이미지를 일반 이미지와 동일한 위치에 알파 값을 0으로 추가 (위에 겹침)
  • 일반 이미지를 페이드 인 + 스케일 아웃 애니메이션으로 표시합니다
  • ↑ 애니메이션이 끝나면 빛나는 이미지가 페이드 인으로 표시됩니다.
  • ↑ 애니메이션이 끝나면 빛나는 이미지를 페이드 아웃 + 스케일 아웃 애니메이션으로 지우십시오

  • 이하, 요소요소의 iOS와 안드로이드의 코드입니다. 쓸 때까지 없는 곳은 생략하고 있습니다.
    ※Android판은 ViewAnimator를 사용하고 있습니다.
    htps : // 기주 b. 코 m / f 렌 t37 / ぃ 에와 마토 r

    빛나는 이미지 생성



    iOS(Swift)


    // 元の画像に白色をhardLightモードでブレンド
    let image = UIImage.imageFromAsset(name: "stamp_complete")?
                    .colorizeImage(color: UIColor.white, blendMode: CGBlendMode.hardLight)
    
    // ブレンドするメソッド
    public func colorizeImage(color: UIColor, blendMode: CGBlendMode = CGBlendMode.plusLighter) -> UIImage? {
        UIGraphicsBeginImageContextWithOptions(self.size, false, 0)
        let context = UIGraphicsGetCurrentContext()
        let rect    = CGRect(origin: CGPoint.zero, size: self.size)
        context?.scaleBy(x: 1, y: -1)
        context?.translateBy(x: 0, y: -rect.size.height)
        context?.saveGState()
        context?.clip(to: rect, mask: self.cgImage!)
        color.set()
        context?.fill(rect)
        context?.restoreGState()
        context?.setBlendMode(blendMode)
        context?.draw(self.cgImage!, in: rect)
        let colorizedImage = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        return colorizedImage   
    }
    

    Android(Java)


    ImageView glowView = new ImageView(getContext());
    glowView.setLayoutParams(new RelativeLayout.LayoutParams(
            LayoutParams.WRAP_CONTENT,
            LayoutParams.WRAP_CONTENT
    ));
    // 元の画像をセット
    glowView.setImageResource(R.drawable.stamp_star);
    glowView.setAdjustViewBounds(true);
    // 画像を明るくするフィルタ
    ColorFilter filter = new LightingColorFilter(Color.rgb(255, 255, 255), Color.rgb(100, 100, 100));
    glowView.setColorFilter(filter);
    

    iOS에서는 UIImage 자체를 가공하고 있지만 Android에서는 ImageView의 필터 메서드를 사용하고 있습니다.

    일반 이미지를 페이드 인 + 스케일 아웃으로 표시



    iOS(Swift)


    // 登場アニメーション(スケールアウト)
    // あらかじめ縮めておく
    stampView.transform = CGAffineTransform(scaleX: 0.01, y: 0.01)
    UIView.animate(withDuration: 0.3,
                   delay: delay,
                   usingSpringWithDamping: 0.5,
                   initialSpringVelocity: 1.0,
                   options: [.beginFromCurrentState],
                   animations: {
                    // もとの大きさに戻す
                    stampView.transform = CGAffineTransform.identity
    },
                   completion: { (finished) in
    })
    
    // 登場アニメーション(フェードイン)
    let alphaAnim = CABasicAnimation(keyPath: "opacity")
    alphaAnim.duration  = 0.15
    alphaAnim.toValue   = 1.0
    alphaAnim.fillMode  = kCAFillModeForwards
    alphaAnim.isRemovedOnCompletion = false
    CATransaction.begin()
    CATransaction.setCompletionBlock {
    }
    stampView.layer.add(alphaAnim, forKey: "stamp")
    CATransaction.commit()
    

    Android(Java)


    // 登場アニメーション(スケールアウト+フェードイン)
    ViewAnimator.animate(view)
            .fadeIn()
            .duration(150)
            .andAnimate(view)
            .scale(0, 1)
            .duration(200)
            .interpolator(new BounceInterpolator())
            .onStop(() -> {
            })
            .start();
    

    여유는 각각의 방법이므로, 완전하게 갖추어져 있지 않습니다.
    Android 버전은 ViewAnimator라는 멋진 라이브러리 덕분에 깨끗이 쓸 수 있습니다.

    빛나는 이미지를 페이드 인으로 표시



    iOS(Swift)


    UIView.animate(withDuration: 0.15, delay: delay, options: [.beginFromCurrentState, .curveLinear], animations: {
        imageView.alpha = 1
    }, completion: { (finished) in
        UIView.animate(withDuration: 0.3, delay: delay, options: [.beginFromCurrentState, .curveEaseOut], animations: {
            imageView.transform = CGAffineTransform(scaleX: 1.8, y: 1.8)
            imageView.alpha     = 0
        }, completion: { (finished) in
        })
    })
    

    Android(Java)


    ViewAnimator.animate(view)
            .onStart(() -> {
                view.setVisibility(VISIBLE);
            })
            .fadeIn()
            .duration(150)
            .thenAnimate(view)
            .scale(1.0f, 1.8f)
            .fadeOut()
            .interpolator(new DecelerateInterpolator())
            .duration(300)
            .onStop(() -> {
            })
            .start();
    

    iOS 버전과 Android 버전의 차이점



    여유



    별이 표시될 때의 확대 애니메이션의 여유는 각각의 방법을 사용하고 있기 때문에 다릅니다. 세세하게 조정하면 갖추어질 수 있다고 생각합니다.
    (Android에서는 BounceInterporator, iOS에서는 animateWithSpringDumping을 이용.)

    가공 후 별 이미지



    iOS 쪽이 흰색이 강한 기분이 들기 때문에, 이쪽도 세세하게 조정하면 더 가까워진다고 생각합니다.

    감상



    빛나는 화상을 준비해 주실 수 있으면 가공 불필요합니다만, 동적으로 바꿀 수 있으면 여러가지 시험하고 싶을 때나 미묘하게 조정하고 싶을 때에 편리합니다.
    코드를 뽑아 부분적으로 싣고 있기 때문에, 만약 이상한 부분이 있으면 가르쳐 주시면 도움이 됩니다.

    좋은 웹페이지 즐겨찾기