您的位置:首页 > 移动开发 > Android开发

Android 实现纵向浏览的ViewPager

2015-06-17 18:04 399 查看
要实现自定义ViewPager,就要自己重写ScollerView,写一个继承ViewGroup的自定义控件。

import android.content.Context;
import android.util.AttributeSet;
import android.view.GestureDetector;
import android.view.GestureDetector.OnGestureListener;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Scroller;

public class MyScrollView extends ViewGroup {
//解析手势的工具
private GestureDetector detector;
//这是一个用于计算
private Scroller myScoller;
//记录down事件时的Y坐标
private int startY;
//记录当前的id值
private int currentId;
private Context context;
//记录是否是快速滑动
private boolean isFling;

//重写构造方法
public MyScrollView(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
this.context = context;
initView();
}

private void initView() {
// TODO Auto-generated method stub
myScoller = new Scroller(context);
detector = new GestureDetector(new OnGestureListener() {

@Override
public boolean onSingleTapUp(MotionEvent e) {
// TODO Auto-generated method stub
return false;
}

@Override
public void onShowPress(MotionEvent e) {
// TODO Auto-generated method stub

}
//滑动事件
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2,
float distanceX, float distanceY) {
// TODO Auto-generated method stub
scrollBy(0, (int) distanceY);
return false;
}

@Override
public void onLongPress(MotionEvent e) {
// TODO Auto-generated method stub

}
//快速滑动事件
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2,
float velocityX, float velocityY) {
isFling = true;
if (velocityY < 0 && currentId > 0) {
currentId--;
} else if (velocityY > 0 && currentId < getChildCount() - 1) {
currentId++;
}
moveToDest(currentId);
return false;
}

@Override
public boolean onDown(MotionEvent e) {
// TODO Auto-generated method stub
return false;
}
});
}

//对子View进行布局
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
// TODO Auto-generated method stub
for (int i = 0; i < getChildCount(); i++) {
View v = getChildAt(i);
v.layout(0, -getHeight() * i, getWidth(), getHeight() * (1 - i));
}
}

@Override
public boolean onTouchEvent(MotionEvent event) {
// TODO Auto-generated method stub
detector.onTouchEvent(event);
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
startY = (int) event.getY();
break;

case MotionEvent.ACTION_MOVE:

break;
case MotionEvent.ACTION_UP:
//UP事件发生时,先判断是否是快速滑动,若是快速滑动,则GestureDetector会去处理
if (!isFling) {
//若不是快速滑动,则判断滑动到了哪里,向上滑动,或向下滑动
int disY = (int) (event.getY() - startY);
if (disY > getHeight() / 2) {
currentId++;
} else if (disY < -getHeight() / 2) {
currentId--;
}
moveToDest(currentId);
}
break;
}
return true;
}

/**
* 滑动到目标ID的方法
* @param id
*/
private void moveToDest(int id) {
// TODO Auto-generated method stub
id = id >= 0 ? id : 0;
id = id < getChildCount() ? id : (getChildCount() - 1);
int disY = -getScrollY() - id * getHeight();
//给 myScoller设置初始坐标和目标坐标
myScoller.startScroll(0, getScrollY(), 0, disY);
currentId = id;
invalidate();
}

/**
* ViewGroup调用invalidate()方法时,会调用该方法
*/
@Override
public void computeScroll() {
// myScoller会固定时间计算当前位置
if (myScoller.computeScrollOffset()) {
scrollTo(0, myScoller.getCurrY());
//invalidate方法会重复调用computeScroll方法,直到到达myScoller的目标坐标为止
invalidate();
}
super.computeScroll();
}
}

然后将需要添加的视图利用addView方法,添加到MyScollerView中就可以了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: