GestureDetector+Scroller +scrollBy实现仿viewpager

来源:互联网 发布:日程安排提醒软件 编辑:程序博客网 时间:2024/06/05 16:55
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();        }    }}
阅读全文
0 0
原创粉丝点击