カスタムview--雲の影響クジラ

最近、自分で結果を達成することである網易クラウドクラウド効果、などのカスタムビュークジラを実装しています。

ディレクトリ

これは、2つの領域に分割されています。

  1. 回転せん断
  2. 水の波紋の拡散

1.回転とせん断

主に使用した画像のカット、ImageViewのsetOutlineProviderこの方法を、

roundImage.setOutlineProvider(new ViewOutlineProvider() {
    @Override
    public void getOutline(View view, Outline outline) {
        int width = roundImage.getWidth();
        int height = roundImage.getHeight();
        outline.setOval(0, 0, width, height);
    }
});
roundImage.setClipToOutline(true);
复制代码

そして、プロパティアニメーションによって回転

//属性动画让roundImage旋转起来
ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(roundImage, "rotation", 0, 360);
objectAnimator.setDuration(15000);
objectAnimator.setRepeatMode(ValueAnimator.RESTART);
objectAnimator.setInterpolator(new LinearInterpolator());
objectAnimator.setRepeatCount(-1);
objectAnimator.start();
复制代码

ObjectAnimatorはこの記事を参照することができますについて

juejin.im/post/579f02...

2.水波の拡散

主にDiffuseView徐々に下のクラスに○をつけ、その後、遅延を更新します。

  1. まず必要mMaxRadiusWidthmMinRadiusWidthする円の最小および最大半径を得るために、これら2つのパラメータ、mMaxRadiusWidthすることができるonMeasureで取得

    高で幅広いonMeasureを取得します

    mMaxRadiusWidth = Math.min(getMeasuredHeight() / 2, getMeasuredWidth() / 2);
    复制代码

    PS:使用していることに注意してくださいgetWidthgetHeight方法が問題になることが

  2. 次いで、これら2つのパラメータの円の半径を表す、対応する透明度

    private List<Integer> mAlphas = new ArrayList<>();
    
    private List<Integer> mWidths = new ArrayList<>();
    复制代码
  3. あなたは、必要があるかもしれません:ピクセルDPに変換する方法

    float twelveDp = TypedValue.applyDimension( TypedValue.COMPLEX_UNIT_DIP, 12, 
                    mContext.getResources().getDisplayMetrics() );
    复制代码
  4. その後にonDraw円、各更新塗装mAlphas及びmWidths必要ラウンド付加および欠失の増殖に対処するためながら、値を

    for (int i = 0; i < mAlphas.size(); i++) {
        Integer alpha = mAlphas.get(i);
        mPaint.setAlpha(alpha);
        Integer width = mWidths.get(i);
        canvas.drawCircle(getWidth() / 2, getHeight() / 2, width, mPaint);
    
        if (alpha >= 2 && width <= mMaxRadiusWidth) {
            mAlphas.set(i, alpha - 2);
            mWidths.set(i, width + 1);
        } else if (width <= mMinRadiusWidth) {
            mWidths.set(i, width + 1);
        }
    }
    复制代码
  5. そして、遅延をリフレッシュ

    if (mIsDiffuse) {
        postInvalidateDelayed(30);
    }
    复制代码
  6. 注意:オンとオフの円アニメーションの広がりを制御するためにmIsDiffuseパラメータを設定することにより

    における活動のようなオープンなアニメーション:

    diffuseView.start();
    复制代码

これは、あなたが質問や提案がある場合は、問題を通じて質問してくださいスターを歓迎している間、私は時折githubの上で更新し、独自のカスタムビューを作成しますが、私のgithubのアドレスであります

githubのアドレス

この資料では、への参照をしました:

アンドロイドYORK擬音ダイ​​ナミック効率のクラウドクラウドクジラ

ビューのカスタム円形拡散をAndroidの

ます。https://juejin.im/post/5d033e46e51d4550723b13e6で再現

おすすめ

転載: blog.csdn.net/weixin_33696106/article/details/93183935