ITPub博客

首页 > IT职业 > IT图书 > JelloToggle一个回弹效果的动画,用到TimeInterpol

JelloToggle一个回弹效果的动画,用到TimeInterpol

IT图书 作者:cbjly 时间:2021-09-09 09:55:46 0 删除 编辑
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 
计算出回弹的及具体值,然后刷新,并且这个值是回弹的

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

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/2831/viewspace-2814536/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2019-08-16

  • 博文量
    85
  • 访问量
    715