Android实现欢迎界面滑动效果

Android应用大部分都会有欢迎界面,几张whatsnew图片可以左右滑动,这里贴下自己的源码。大概思路是:重写Gallery,重写onFling()。 

为什么不直接用Gallery呢?因为galler默认会有滑动惯性,会出现一次滑动几页的现象,这里明显不合适。

另外,这种方式会有一个小问题,如果你的界面里带了某些控件,而且设置了OnClickListener(),那么用户如果从控件所在区域开始拖动,是不会有拖动效果的,具体原因是onTouchEventonInterceptTouchEvent的传递问题。如果想要解决这个问题,可以看下一篇文章,通过重写AdapterView来实现多页滑动效果。

 

 

贴下代码:

import android.content.Context;

import android.util.AttributeSet;

import android.view.KeyEvent;

import android.view.MotionEvent;

import android.view.ViewConfiguration;

import android.widget.Gallery; 

public class SingleScrollGallery extends Gallery { 

private static final int TOUCH_STATE_REST = 0;

private static final int TOUCH_STATE_SCROLLING = 1; 

private int mTouchState = TOUCH_STATE_REST;

private int mTouchSlop;

private float mLastMotionX;

private float mLastMotionY;

 

public SingleScrollGallery(Context context ,AttributeSet attrSet) { 

     super(context,attrSet); 

     // TODO Auto-generated constructor stub 

    

     mTouchSlop = ViewConfiguration.get(getContext()).getScaledTouchSlop();

    } 

 

@Override 

 public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, 

   float velocityY) { 

  // TODO Auto-generated method stub 

//          return super.onFling(e1, e2, velocityX, velocityY);//方法一:只去除翻页惯性 

//  return false;//方法二:只去除翻页惯性  注:没有被注释掉的代码实现了开始说的2种效果。 

  int kEvent;   

  if(isScrollingLeft(e1, e2)){  

   //Check if scrolling left      

   kEvent = KeyEvent.KEYCODE_DPAD_LEFT;   

   }  else{  

    //Otherwise scrolling right     

    kEvent = KeyEvent.KEYCODE_DPAD_RIGHT;    

    }   

  onKeyDown(kEvent, null);   

  return true;    

  } 

 

private boolean isScrollingLeft(MotionEvent e1, MotionEvent e2) 

   {    

    return e2.getX() > e1.getX();  

   }

 

@Override

public boolean onTouchEvent(MotionEvent event) {

// TODO Auto-generated method stub

return super.onTouchEvent(event);

}

 

@Override

public boolean onInterceptTouchEvent(MotionEvent ev) {

final int action = ev.getAction();

if ((action == MotionEvent.ACTION_MOVE) &&

(mTouchState != TOUCH_STATE_REST)) {

return true;

}

 

final float x = ev.getX();

final float y = ev.getY();

 

switch (action) {

case MotionEvent.ACTION_MOVE:

final int xDiff = (int)Math.abs(mLastMotionX-x);

if (xDiff>0) {

mTouchState = TOUCH_STATE_SCROLLING;

 }

break;

 

case MotionEvent.ACTION_DOWN:

mLastMotionX = x;

mLastMotionY = y;

mTouchState = TOUCH_STATE_REST;

break;

 

case MotionEvent.ACTION_CANCEL:

case MotionEvent.ACTION_UP:

mTouchState = TOUCH_STATE_REST;

break;

}

 

return mTouchState != TOUCH_STATE_REST;

}

}

posted @ 2012-05-30 14:46  brainy  阅读(5561)  评论(8编辑  收藏  举报