Android 实现纵向浏览的ViewPager

来源:互联网 发布:百胜yum统一认证平台 编辑:程序博客网 时间:2024/06/03 20:05

要实现自定义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 stubthis.context = context;initView();}private void initView() {// TODO Auto-generated method stubmyScoller = new Scroller(context);detector = new GestureDetector(new OnGestureListener() {@Overridepublic boolean onSingleTapUp(MotionEvent e) {// TODO Auto-generated method stubreturn false;}@Overridepublic void onShowPress(MotionEvent e) {// TODO Auto-generated method stub}//滑动事件@Overridepublic boolean onScroll(MotionEvent e1, MotionEvent e2,float distanceX, float distanceY) {// TODO Auto-generated method stubscrollBy(0, (int) distanceY);return false;}@Overridepublic void onLongPress(MotionEvent e) {// TODO Auto-generated method stub}//快速滑动事件@Overridepublic 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;}@Overridepublic boolean onDown(MotionEvent e) {// TODO Auto-generated method stubreturn false;}});}//对子View进行布局@Overrideprotected void onLayout(boolean changed, int l, int t, int r, int b) {// TODO Auto-generated method stubfor (int i = 0; i < getChildCount(); i++) {View v = getChildAt(i);v.layout(0, -getHeight() * i, getWidth(), getHeight() * (1 - i));}}@Overridepublic boolean onTouchEvent(MotionEvent event) {// TODO Auto-generated method stubdetector.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 stubid = 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()方法时,会调用该方法 */@Overridepublic void computeScroll() {// myScoller会固定时间计算当前位置if (myScoller.computeScrollOffset()) {scrollTo(0, myScoller.getCurrY());//invalidate方法会重复调用computeScroll方法,直到到达myScoller的目标坐标为止invalidate();}super.computeScroll();}}

然后将需要添加的视图利用addView方法,添加到MyScollerView中就可以了。


0 0
原创粉丝点击