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); } } };
计算出回弹的及具体值,然后刷新,并且这个值是回弹的
點擊查看更多內容
為 TA 點贊
評論
評論
共同學習,寫下你的評論
評論加載中...
作者其他優質文章
正在加載中
感謝您的支持,我會繼續努力的~
掃碼打賞,你說多少就多少
贊賞金額會直接到老師賬戶
支付方式
打開微信掃一掃,即可進行掃碼打賞哦