亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

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

JelloToggle一個回彈效果的動畫,用到TimeInterpolator

標簽:
Android
JelloToggle extends FrameLayout
首先调用onMeasure方法计算计算宽高和限制距离等操作
mJelloRect.set(getMeasuredWidth() - mJelloSize, 0, getMeasuredWidth() + mDragLimit,
        mJelloSize);但是为什么要右边出去一点呢
mCheckedDrawable.setBounds(mJelloRect.left, mJelloRect.top, mJelloRect.left + mJelloSize,
        mJelloSize);
mOnCheckDrawable.setBounds(mJelloRect.left, mJelloRect.top, mJelloRect.left + mJelloSize,
        mJelloSize);
mUnCheckedDrawable.setBounds(mJelloRect.left, mJelloRect.top, mJelloRect.left + mJelloSize,
        mJelloSize)设置图片的位置
然后执行private void calPath() {
    mJelloPath.rewind();
    mJelloPath.moveTo(mJelloRect.right, 0);
    mJelloPath.lineTo(mJelloRect.left, 0);
    mJelloPath.cubicTo(mJelloRect.left, mJelloSize / 2, mJelloRect.left + mJelloOffset -
                    mJelloSize / 3, mJelloSize * 3 / 4,
            mJelloRect.left, mJelloSize);
    mJelloPath.lineTo(mJelloRect.right, mJelloRect.bottom);
    mJelloPath.close();
}
画图。有贝塞尔曲线点的路径,在下面 dispatchDraw方法中有调用
@Override
protected void dispatchDraw(Canvas canvas) {
    canvas.save();
    canvas.translate(mScrollOffset, 0);
    super.dispatchDraw(canvas);
    canvas.restore();
    canvas.save();
    canvas.translate(mScrollOffset / 2, 0);
    canvas.drawPath(mJelloPath, mJelloPaint);
    mDrawable.draw(canvas);
    canvas.restore();
}
这是一个画子view的类, canvas.save(); canvas.restore();配对使用,进行缩放和位移的时候,一个是画textview,一个是画我们的view,
@Override
public boolean onTouchEvent(MotionEvent event) {
    boolean ret = true;
    switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            if (!mScroller.isFinished()) {
                mScroller.forceFinished(true);
            }
            mTouchStartX = (int) event.getX();
            mDrawable = mOnCheckDrawable;
            break;
        case MotionEvent.ACTION_MOVE:
            int dragLen = Math.min(0, (int) event.getX() - mTouchStartX);
            mScrollOffset = Math.max(-mDragLimit, dragLen);
            mJelloOffset = dragLen;
            calPath();
            postInvalidate();
            break;
        case MotionEvent.ACTION_UP:
            if (mScrollOffset < 0) {
                mScroller.startScroll(mScrollOffset, 0, -mScrollOffset, 0);
                mJelloMax = mJelloOffset;
                if (mJelloOffset <= -mDragLimit) {
                    mChecked = !mChecked;
                    if (mListener != null) {
                        mListener.onCheckedChange(mChecked);
                    }
                }
                setJelloState();
                postInvalidate();
                startJello();
            }
            break;
    }

    return ret;
}
使用finish,移动的时候,记录整个view和自己的view移动的距离,进行画图用
mScroller.startScroll(mScrollOffset, 0, -mScrollOffset, 0);对自己进行回弹
private Runnable mJelloRunnable = new Runnable() {
    @Override
    public void run() {
        long playTime = AnimationUtils.currentAnimationTimeMillis() - mStartTime;
        if (playTime < mDuration) {
            float fraction = playTime / (float) mDuration;
            mJelloOffset = (int) (mJelloMax * (1 - mInterpolator.getInterpolation
                    (fraction)));
            calPath();
            ViewCompat.postInvalidateOnAnimation(JelloToggle.this);
            post(this);
        } else {
            mJelloOffset = 0;
            calPath();
            ViewCompat.postInvalidateOnAnimation(JelloToggle.this);
        }
    }
};
计算出回弹的及具体值,然后刷新,并且这个值是回弹的

原文链接:http://www.apkbus.com/blog-880881-63442.html

點擊查看更多內容
TA 點贊

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

評論

作者其他優質文章

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

100積分直接送

付費專欄免費學

大額優惠券免費領

立即參與 放棄機會
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號

舉報

0/150
提交
取消