package com.practice.syd.gesture; import android.content.Context; import android.util.AttributeSet; import android.view.GestureDetector; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; import android.widget.Scroller; /** * Created by Administrator on 2017/11/16. */ class MyViewPager extends ViewGroup { private GestureDetector gestureDetector; private Context context; private float startX; private Scroller scroll; private int currentposition; private float endX; public MyViewPager(Context context, AttributeSet attrs) { super(context, attrs); this.context=context; initview(); } @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(getWidth()*i,0,getWidth()*(i+1),getHeight()); } } private void initview(){ scroll=new Scroller(context); //手势识别器 gestureDetector=new GestureDetector(context, new GestureDetector.OnGestureListener() { @Override public boolean onDown(MotionEvent e) { return false; } @Override public void onShowPress(MotionEvent e) { } @Override public boolean onSingleTapUp(MotionEvent e) { return false; } @Override public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { scrollBy((int)distanceX,0); return true; } @Override public void onLongPress(MotionEvent e) { } @Override public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { return false; } }); } @Override public boolean onTouchEvent(MotionEvent event) { super.onTouchEvent(event); gestureDetector.onTouchEvent(event); switch (event.getAction()){ case MotionEvent.ACTION_DOWN: startX=event.getX(); break; case MotionEvent.ACTION_MOVE: break; case MotionEvent.ACTION_UP: endX=event.getX(); int tempposition = currentposition; if(endX-startX>getWidth()/2){ tempposition--; }else if(startX-endX>getWidth()/2){ tempposition++; } scrolltopager(tempposition); } return true; } private void scrolltopager(int tempposition) { if(tempposition<0) tempposition=0; else if(tempposition>getChildCount()-1) tempposition=getChildCount()-1; currentposition=tempposition; // scrollTo(currentposition*getWidth(),0); scroll.startScroll(getScrollX(),getScrollY(),currentposition*getWidth()-getScrollX()); invalidate(); } @Override public void computeScroll() { // super.computeScroll(); if(scroll.computeScrollOffset()){ int x=scroll.getCurrX(); scrollTo(x,0); invalidate(); } } }
GestureDetector+Scroller +scrollBy实现仿viewpager
最新推荐文章于 2021-03-28 19:25:35 发布