1.自定义ViewPager
xml文件
<com.example.viewpager2.MyViewPager
android:layout_width="match_parent"
android:layout_height="450dp"
android:id="@+id/MyViewPager"
/>
实例化
public class MainActivity extends Activity {
private MyViewPager MyViewPager;
int ids[]={R.drawable.a1,R.drawable.a2,R.drawable.a3,R.drawable.a4,R.drawable.a5,R.drawable.a6};
@Override
protected void onCreate(Bundle savedInstanceState) {
requestWindowFeature(Window.FEATURE_NO_TITLE);//隐藏标题
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
MyViewPager = (MyViewPager) findViewById(R.id.MyViewPager);
//添加页面
for (int i = 0; i < ids.length; i++) {
ImageView imageView = new ImageView(this);
imageView.setBackgroundResource(ids[i]);
//添加到MyViewPager这个View中
MyViewPager.addView(imageView);
}
}
}
指定到对应的图片上
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
//遍历孩子,给每个孩子指定在屏幕上的坐标位置
for (int i = 0; i < getChildCount(); i++) {
View childView = getChildAt(i);
childView.layout(i * getWidth(), 0, (i + 1) * getWidth(), getHeight());
}
}
2.手势识别器
* 1.定义出来
private GestureDetector detector;
* 2.实例化-把想要的方法重新
private void initView(final Context context) {
detector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() {
@Override
public void onLongPress(MotionEvent e) {
Toast.makeText(context, "长按", Toast.LENGTH_SHORT).show();
super.onLongPress(e);
}
/**
*
* @param e1
* @param e2
* @param distanceX 在X轴上滑动的距离
* @param distanceY 在轴上滑动的距离
* @return
*/
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
Toast.makeText(context, "滚动", Toast.LENGTH_SHORT).show();
/**
* X:要在X轴移动的距离
* Y:要在Y轴移动的距离
* */
scrollBy((int) distanceX, 0);
return true;
}
@Override
public boolean onDoubleTap(MotionEvent e) {
Toast.makeText(context, "双击", Toast.LENGTH_SHORT).show();
return super.onDoubleTap(e);
}
});
}
* 3.在OnTouchEvent()把事件传递给手势识别器
@Override
public boolean onTouchEvent(MotionEvent event) {
super.onTouchEvent(event);
//3.把事件传递给手势识别器
detector.onTouchEvent(event);
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
break;
case MotionEvent.ACTION_MOVE:
break;
case MotionEvent.ACTION_UP:
break;
}
return true;
}
3.scrollBy 正值:左移
负值:右移
scrollTo :起始值+要移动的距离 = 要移动到那里去 ,根据坐标移动
4.回弹 上下页面
@Override
public boolean onTouchEvent(MotionEvent event) {
super.onTouchEvent(event);
//3.把事件传递给手势识别器
detector.onTouchEvent(event);
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
Log.w("www","onTouchEvent == ACTION_DOWN");
//1.记录坐标
startX = event.getX();
break;
case MotionEvent.ACTION_MOVE:
Log.w("www","onTouchEvent == ACTION_MOVE");
break;
case MotionEvent.ACTION_UP:
Log.w("www","onTouchEvent == ACTION_UP");
//2.来到新的坐标
enddX = event.getX();
//下标位置
int tempIndex = currentIndex;
if ((startX - enddX) > getWidth() / 2) {
//显示下一个页面
tempIndex++;
} else if ((enddX - startX) > getWidth() / 2) {
//显示上一个页面
tempIndex--;
}
//根据下标位置移动到指定页面
scrollToPager(tempIndex);
break;
}
return true;
}
/**
* 屏蔽非法值,根据下标位置移动到指定页面
*
* @param tempIndex
*/
public void scrollToPager(int tempIndex) {
if (tempIndex < 0) {
tempIndex = 0;
} else if (tempIndex > getChildCount() - 1) {
tempIndex = getChildCount() - 1;
}
//当前变量的下标位置
currentIndex = tempIndex;
//移动到指定位置
scrollTo(currentIndex*getWidth(),0);
}
5.解决回弹生硬