-
-
Save r17171709/5189503e1ea92aa8bc8b to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
//滑动视图 | |
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