今天工作有点忙,就先贴上源码,有时间了再详细说明吧。
可以完整执行的上下翻页源码被我上传至资源页:http://download.csdn.net/detail/fener10289/6284691
主要实现上下滑动翻页的自定义控件代码:
package com.example.flingpage;
import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.VelocityTracker;
import android.view.View;
import android.view.ViewConfiguration;
import android.view.ViewGroup;
import android.view.View.MeasureSpec;
import android.widget.Scroller;
/**
* 自定义一个ScrollView实现屏幕的上下滑动
*/
public class DefinedScrollView extends ViewGroup {
// 用来平滑过渡各个页面之间的切换,需要进行平滑的滚动,就要重写其ComputeScroll方法
private Scroller mScroller;
// 用来检测用户的手势,或者也可用GestureDetector
private VelocityTracker mVelocityTracker;
// 当前的屏幕索引
private int mCurrentScreen;
// 翻屏的页数
//private int mPage = 0;
// 默认的屏幕索引
private int mDefaultScreen = 0;
// 屏幕闲置时
private static final int TOUCH_STATE_REST = 0;
// 屏幕滚动时
private static final int TOUCH_STATE_SCROLLING = 1;
// 滚动速度
private static final int SNAP_VELOCITY = 600;
// 触屏状态为当前屏幕闲置
private int mTouchState = TOUCH_STATE_REST;
// 触屏溢出
private int mTouchSlop;
/* // 最后的横向手势坐标
private float mLastMotionX; */
// 最后的纵向手势坐标
private float mLastMotionY;
private PageListener pageListener;
/**
* 在构造方法中初始化各个状态
*
* @param context
* @param attrs
* @param defStyle
* ScrollView的默认样式
*/
public DefinedScrollView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
mScroller = new Scroller(context);
// 当前屏幕即为默认的屏幕,即为第一屏
mCurrentScreen = mDefaultScreen;
// 是一个距离,表示滑动的时候,手的移动要大于这个距离才开始移动控件
mTouchSlop = ViewConfiguration.get(getContext()).getScaledTouchSlop();
}
public DefinedScrollView(Context context, AttributeSet attrs) {
// 0表示没有风格
this(context, attrs, 0);
}
/**
* 横向画出每一个子view,这样所得到的view的高与屏幕高一致,宽度为getChildCount()-1个屏幕宽度的view。
*/
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
///int childLeft = 0;
int childTop = 0;
int childCount = getChildCount();
for (int i = 0; i &l