Skip to content

Instantly share code, notes, and snippets.

@r17171709
Last active August 29, 2015 14:22
Show Gist options
  • Save r17171709/5189503e1ea92aa8bc8b to your computer and use it in GitHub Desktop.
Save r17171709/5189503e1ea92aa8bc8b to your computer and use it in GitHub Desktop.
//滑动视图
public class MyScrollView extends ViewGroup {
Context context;
Scroller scroller=null;
VelocityTracker tracker=null;
//判断点击还是滑动
int touchSlop=0;
//滑动速度临界值
int minVelocity=0;
//手指触摸开始位置
int touchStart=0;
//手指id
int mPointerId=0;
public MyScrollView(Context context) {
this(context, null);
}
public MyScrollView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public MyScrollView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init(context);
}
private void init(Context context) {
this.context=context;
scroller=new Scroller(context);
touchSlop= ViewConfiguration.get(context).getScaledTouchSlop();
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
for (int i=0;i<getChildCount();i++) {
View view=getChildAt(i);
measureChild(view, widthMeasureSpec, heightMeasureSpec);
}
setMeasuredDimension(widthMeasureSpec, heightMeasureSpec);
}
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
for (int i=0;i<getChildCount();i++) {
View view=getChildAt(i);
view.layout(i*getMeasuredWidth(), 0, (i+1)*getMeasuredWidth(), view.getMeasuredHeight());
}
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
touchStart= (int) ev.getX();
break;
case MotionEvent.ACTION_MOVE:
if (Math.abs(ev.getX()-touchStart)>touchSlop) {
return true;
}
}
return super.onInterceptTouchEvent(ev);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
if (tracker==null) {
tracker=VelocityTracker.obtain();
}
tracker.addMovement(event);
//多点触控action
switch (event.getActionMasked()) {
case MotionEvent.ACTION_DOWN:
//获取索引值为0的手指id
mPointerId=event.getPointerId(0);
if (!scroller.isFinished()) {
scroller.abortAnimation();
}
return true;
case MotionEvent.ACTION_MOVE:
//可能在滑动过程中发生了手指变动,即换了一个手指,所以需要每次查找获取新的手指位置
int index=event.findPointerIndex(mPointerId);
int temp= (int) event.getX(index);
scrollBy(-(temp-touchStart), 0);
touchStart=temp;
break;
case MotionEvent.ACTION_UP:
tracker.computeCurrentVelocity(1000);
float velocityX=tracker.getXVelocity();
//向右滑动
if (velocityX>minVelocity) {
}
//向左滑动
else if (velocityX<-minVelocity) {
}
//保留在当前页面
else {
}
if (tracker!=null) {
tracker.recycle();
tracker=null;
}
break;
case MotionEvent.ACTION_POINTER_UP:
//获取离开屏幕的索引值
int pointerIndexLeave=event.getActionIndex();
//获取离开屏幕的手指id
int pointerIdLeave=event.getPointerId(pointerIndexLeave);
if (pointerIdLeave ==mPointerId) {
int reIndex=pointerIndexLeave==0?1:0;
mPointerId=event.getPointerId(reIndex);
touchStart= (int) event.getX(mPointerId);
if (tracker!=null) {
tracker.recycle();
tracker=null;
}
}
break;
}
return super.onTouchEvent(event);
}
@Override
public void computeScroll() {
super.computeScroll();
if (scroller.computeScrollOffset()) {
scrollTo(scroller.getCurrX(), scroller.getCurrY());
postInvalidate();
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment