<?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; } }