实现自定义控件侧拉列表的平滑移动

第一种:
自定义控件extends ViewGroup时:
case MotionEvent.ACTION_UP:
    if(getMyscrollX()<menuWidth/2){
        startScroll(0);
    }else{
        startScroll(menuWidth);
    }
    break;

/**
 * 以动画的方式滚动到指定的位置
 *
 * @param destX 要滑动到哪里(目标位置)
 */
private void startScroll(int destX) {
    currentX = destX;           // 界面当前的位置
    int startX = getMyscrollX();   // 指定从哪里开始滑动
    int distatnceX = destX - startX;// 要滑动的距离
    int duration = 800;
    scroller.startScroll(startX, 0, distatnceX, 0, duration);

    invalidate();
    // 刷新界面,内部会调用ViewGroup的draw方法,draw方法调用dispatchDraw方法-->
    // drawChild-->子View的draw方法-->computeScroll()
}

@Override
public void computeScroll() {
    if (scroller.computeScrollOffset()) {  // 如果数值没有模拟完,则返回true
        int currX = scroller.getCurrX();   // 模拟出来的滑动值
        scrollTo(currX);
        invalidate();
        count++;
    }
   
}

第二种
自定义控件extends FrameLayout时:

@Override
public void onViewReleased(View releasedChild, float xvel, float yvel) {
    super.onViewReleased(releasedChild, xvel, yvel);
    if(mainView.getLeft()>dragRange/2){
        viewdraghelper.smoothSlideViewTo(mainView,dragRange,0);
        ViewCompat.postInvalidateOnAnimation(SlideMenu.this);
    }else{
        viewdraghelper.smoothSlideViewTo(mainView,0,0);
        ViewCompat.postInvalidateOnAnimation(SlideMenu.this);
    }

}
 
public void computeScroll() {
    super.computeScroll();
    if(viewdraghelper.continueSettling(true)){
        //刷新
        ViewCompat.postInvalidateOnAnimation(SlideMenu.this);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值