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 使用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 计算出回弹的及具体值,然后刷新,并且这个值是回弹的
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/2831/viewspace-2814536/ ,如需转载,请注明出处,否则将追究法律责任。