public class MyViewPager extends ViewGroup {
private int page;//當前頁的索引
private GestureDetector detector;//手勢探測
private Context context;//控件創立的上下文
private MyScroller scroller;//緩慢頁面切換幫助類,
private boolean isFling;//用於判斷
private MyViewOnPageChangedListener listener;//頁面變化監聽事件
/**
*創建兩個參數的構造函數,用於在佈局文件中使用。在構造函數中,調用initView()方法初始化控件,建立GestureDetector對象,響應屏幕觸摸事件。
*/
public MyViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
this.context=context;
// TODO Auto-generated constructor stub
initView();
}
public void initView(){
scroller=new MyScroller();
detector=new GestureDetector(context,new GestureDetector.OnGestureListener(){
@Override
public boolean onDown(MotionEvent e) {
// TODO Auto-generated method stub
return false;
}
@Override
public void onShowPress(MotionEvent e) {
// TODO Auto-generated method stub
}
@Override
public boolean onSingleTapUp(MotionEvent e) {
// TODO Auto-generated method stub
return false;
}
/**
* 圖片緩慢滑動效果
*/
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2,
float distanceX, float distanceY) {
// TODO Auto-generated method stub
scrollBy((int)distanceX,0);
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) {
// TODO Auto-generated method stub
isFling=true;
if(velocityX<0&&page<getChildCount()-1){
page++;
}else if(velocityX>0&&page>0){
page--;
}
moveToDes(page);
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++){
getChildAt(i).layout(i*getWidth(),0,getWidth()+i*getWidth(),getHeight());
}
}
/** * 重載onTouchEvent方法,設置page值,當手指滑動超過二分之一屏幕寬度時,切換到下一個或上一個頁面, * 當不足二分之一屏幕寬度時,頁面不切換 */
private int firstPosition;//記錄手指按下時的位置
@Override
public boolean onTouchEvent(MotionEvent event) {
// TODO Auto-generated method stub
detector.onTouchEvent(event);
super.onTouchEvent(event);
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
firstPosition=(int)event.getX();
break;
case MotionEvent.ACTION_UP:
/**
* 用isFling區分緩慢移動和快速移動
*/
if(!isFling){
if(event.getX()-firstPosition>getWidth()/2){
page=page-1;
}else if(firstPosition-event.getX()>getWidth()/2){
page=page+1;
}
moveToDes(page);
break;
}
isFling=false;
}
return true;
}
/**
* 使其移動到page相應的頁面
* @param page
*/
public void moveToDes(int page) {
// TODO Auto-generated method stub
if(page<=0){
page=0;
}
if(page>=getChildCount()-1){
page=getChildCount()-1;
}
/**
* 迅速頁面切換
*/
//scrollTo(page*getWidth(), 0);
/**
* 添加頁面變化監聽,監聽事件放入常常調用的方法裏,顯示事件的常常調用
*/
listener.onPageChanged(page);
//緩慢頁面切換動畫
int distance=page*getWidth()-getScrollX();
scroller.startScroll(getScrollX(), distance);
invalidate();//刷新頁面,重畫,而且從新執行computeScroll()
}
//重複執行該方法,實現動畫效果
@Override
public void computeScroll() {
// TODO Auto-generated method stub
super.computeScroll();
if(scroller.isScrolling()){
scrollTo(scroller.getCurrentX(), 0);
invalidate();
}
}
/**
* 設置監聽事件方法
* @param listener
*/
public void setPageChangedListener(MyViewOnPageChangedListener listener){
this.listener=listener;
}
/**
* 監聽事件接口,監聽頁面變化
* @author Charles
*
*/
interface MyViewOnPageChangedListener{
public void onPageChanged(int page);
}
}