自定义ViewPager

来源:互联网 发布:淘宝卖家设置花呗支付 编辑:程序博客网 时间:2024/06/05 07:07

<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:id="@+id/activity_main"    android:layout_width="match_parent"    android:layout_height="match_parent"    tools:context="com.example.administrator.viewpager.MainActivity">    <com.example.administrator.viewpager.MyViewPager        android:id="@+id/my_viewpager"        android:layout_width="match_parent"        android:layout_height="match_parent" /></RelativeLayout>


package com.example.administrator.viewpager;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.widget.ImageView;public class MainActivity extends AppCompatActivity {    private MyViewPager viewPager;    private int[] datas;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        initView();        initDatas();        initEvent();    }    private void initView() {        viewPager = (MyViewPager) findViewById(R.id.my_viewpager);    }    private void initDatas() {        datas = new int[]{R.drawable.image01, R.drawable.image02, R.drawable.image03, R.drawable.image04};        for (int i = 0; i < datas.length; i++) {            ImageView iv = new ImageView(MainActivity.this);            iv.setBackgroundResource(datas[i]);            viewPager.addView(iv);        }    }    private void initEvent() {    }}


package com.example.administrator.viewpager;import android.content.Context;import android.util.AttributeSet;import android.util.Log;import android.view.GestureDetector;import android.view.MotionEvent;import android.view.View;import android.view.ViewGroup;/** * Created by Administrator on 2017/5/16. */public class MyViewPager extends ViewGroup {    private static final String TAG = "TAG";    private GestureDetector mDetector;    private float startX;    private int currentIndex;    private MyScroll myScroll;    public MyViewPager(Context context, AttributeSet attrs) {        super(context, attrs);        initView(context);    }    private void initView(Context context) {        myScroll = new MyScroll();        mDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() {            @Override            public void onLongPress(MotionEvent e) {                super.onLongPress(e);                Log.e(TAG, "长按");            }            /**             *             * @param e1:开始点击的             * @param e2:接受位置的             * @param distanceX             * @param distanceY             * @return             */            @Override            public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {                if (currentIndex == 0 && e2.getX() > e1.getX()) {                    scrollBy(0, 0);                } else if (currentIndex == getChildCount() - 1 && e2.getX() < e1.getX()) {                    scrollBy(0, 0);                } else {                    scrollBy((int) distanceX, 0);                }                return true;            }            @Override            public boolean onDoubleTapEvent(MotionEvent e) {                Log.e(TAG, "双击");                return super.onDoubleTapEvent(e);            }        });    }    @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 * getWidth(), 0, (i + 1) * getWidth(), getHeight());        }    }    @Override    public boolean onTouchEvent(MotionEvent event) {        super.onTouchEvent(event);        mDetector.onTouchEvent(event);        switch (event.getAction()) {            case MotionEvent.ACTION_DOWN:                startX = event.getX();                break;            case MotionEvent.ACTION_MOVE:                break;            case MotionEvent.ACTION_UP:                float endX = event.getX();                int index = currentIndex;                if ((startX - endX) > getWidth() / 2) {//从右→左滑动                    index++;                } else if ((endX - startX) > getWidth() / 2) {//从左←右滑动                    index--;                }                scrollToPager(index);                break;        }        return true;    }    /**     * 屏蔽非法值,根据位置移动到指定页面     *     * @param index     */    private void scrollToPager(int index) {        if (index > getChildCount() - 1) {            index = getChildCount() - 1;        }        if (index < 0) {            index = 0;        }        currentIndex = index;//        scrollTo(currentIndex * getWidth(), 0);        myScroll.startScroll(getScrollX(), getScrollY(), currentIndex * getWidth() - getScrollX(), 0);        invalidate();//执行后会调用Draw(),computeScroll();    }    @Override    public void computeScroll() {        if (myScroll.computeScrollOffset()) {            scrollTo((int) myScroll.getCurrX(), 0);            invalidate();        }    }}
package com.example.administrator.viewpager;import android.os.SystemClock;/** * Created by Administrator on 2017/5/16. */public class MyScroll {    /**     * X轴起始坐标     */    private float startScrollX;    /**     * Y轴起始坐标     */    private float startScrollY;    /**     * X轴要滑动的距离     */    private int distanceX;    /**     * Y轴要滑动的距离     */    private int distanceY;    /**     * 开机时间     */    private long startTime;    /**     * 是否滑动结束     * true:滑动结束     * false:未结束     */    private boolean isFinish;    /**     * 总时间     */    private long totalTime = 300;    private float currX;    /**     * @param startScrollX:开始位置的X     * @param startScrollY:开始位置的Y     * @param distanceX:X轴要滑动的距离     * @param distanceY:Y轴要滑动的距离     */    public void startScroll(float startScrollX, float startScrollY, int distanceX, int distanceY) {        this.startScrollX = startScrollX;        this.startScrollY = startScrollY;        this.distanceX = distanceX;        this.distanceY = distanceY;        this.startTime = SystemClock.uptimeMillis();//系统开机时间        this.isFinish = false;    }    public float getCurrX() {        return currX;    }    public boolean computeScrollOffset() {        if (isFinish) {            return false;        }        long endTime = SystemClock.uptimeMillis();        long passTime = endTime - startTime;        if (passTime < totalTime) {            //平均速度            //移动的距离:注意:不能将平均速度跟时间分开写会出现不良效果            long s = passTime * distanceX / totalTime;            currX = startScrollX + s;        } else {            isFinish = true;            currX = startScrollX + distanceX;        }        return true;    }}





原创粉丝点击