第一种:
自定义控件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);
}
}