Android應用大部分都會有歡迎界面,幾張whatsnew圖片可以左右滑動,這里貼下自己的源碼。大概思路是:重寫Gallery,重寫onFling()。
為什么不直接用Gallery呢?因為galler默認會有滑動慣性,會出現一次滑動幾頁的現象,這里明顯不合適。
另外,這種方式會有一個小問題,如果你的界面里帶了某些控件,而且設置了OnClickListener(),那么用戶如果從控件所在區域開始拖動,是不會有拖動效果的,具體原因是onTouchEvent和onInterceptTouchEvent的傳遞問題。如果想要解決這個問題,可以看下一篇文章,通過重寫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;
}
}