第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機(jī)立即綁定

自己做一個Android圓形揭示動畫

標(biāo)簽:
Android

Picture

Picture

圆形揭示动画在很多情况下都可以使用,比如说转场、打开popupwidow和覆盖一层新的view。
官方也提供了一个类专门提供这个动画的封装:

ViewAnimationUtils.createCircularReveal(View view,            int centerX,  int centerY, float startRadius, float endRadius)

然而这个方法必须api 5.0以上才能使用,既然如此不如自己动手造轮子。

思路:
1.只负责显示的范围,所以继承自FrameLayout,具体显示的内容由Child负责。
2.如何控制child显示的区域?在dispatchDraw中调用canvas.clipPath(Path path)把需要显示的区域裁剪出来。
3.如何显示圆?

 mCirclePath.reset();
 mCirclePath.addCircle(float x, float y, float radius, Direction dir)

4.动画用ValueAnimator。

具体流程:

 /**
     * 开始揭示动画
     * @param x 动画开始位置的x值
     * @param y 动画开始位置的y值
     */
    public void revealLayout(int x, int y){
        mCenterX = x;
        mCenterY = y;
        computeFarthest();
        computeVisibleRegion();        if (mAnimator == null) {
            mAnimator = ValueAnimator.ofFloat(0,1);
            mAnimator.setDuration(DEFAULT_ANIMATION_DURATION);
            mAnimator.setInterpolator(new DecelerateInterpolator());
            mAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {                @Override
                public void onAnimationUpdate(ValueAnimator animation) {
                    mAnimationValue = (float) animation.getAnimatedValue();
                    postInvalidate((int) (mVisibleRectF.left*mAnimationValue),(int) (mVisibleRectF.top*mAnimationValue)
                            ,(int) (mVisibleRectF.right*mAnimationValue),(int) (mVisibleRectF.bottom*mAnimationValue));

                }
            });
        }
        mAnimator.start();
    }

开始动画,传入动画开始的坐标值xy。
computeFarthest()计算动画开始点与Layout四个角的最远距离,即圆形为最大时的半径。
computeVisibleRegion()计算圆形显示区域的外界矩形,用于postInvalidate()时指定刷新的区域,减少绘制开销。

  @Override
    protected void dispatchDraw(Canvas canvas) {        if (mAnimationValue == 0){            return;
        }
        canvas.save();
        mCirclePath.reset();
        mCirclePath.addCircle(mCenterX,mCenterY,mFarthest*mAnimationValue, Path.Direction.CW);
        canvas.clipPath(mCirclePath);        super.dispatchDraw(canvas);
        canvas.restore();
    }

动画开始前不绘制Layout里的内容,动画开始后根据mAnimationValue的值改变圆形的大小。mFarthest为之前通过computeFarthest()计算出来的结果。

原文链接:http://www.apkbus.com/blog-822715-77235.html

點擊查看更多內(nèi)容
TA 點贊

若覺得本文不錯,就分享一下吧!

評論

作者其他優(yōu)質(zhì)文章

正在加載中
  • 推薦
  • 評論
  • 收藏
  • 共同學(xué)習(xí),寫下你的評論
感謝您的支持,我會繼續(xù)努力的~
掃碼打賞,你說多少就多少
贊賞金額會直接到老師賬戶
支付方式
打開微信掃一掃,即可進(jìn)行掃碼打賞哦
今天注冊有機(jī)會得

100積分直接送

付費專欄免費學(xué)

大額優(yōu)惠券免費領(lǐng)

立即參與 放棄機(jī)會
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號

舉報

0/150
提交
取消