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;

}

}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM