2011-08-16 45 views
1

Helo Evryone!無法水平滑動屏幕

我想在我的應用程序中添加「輕掃」功能,但我無法這樣做。我有故事要左右滑動,反之亦然。我寫了一個具有以下實現的子類MYGestureListener。

class MyGestureListener extends SimpleOnGestureListener { 

    @Override 
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { 

     Log.e("Now", "onFling"); 

     try { 
      if (Math.abs(e1.getY() - e2.getY()) > SWIPE_MAX_OFF_PATH) 
       return false; 

      // right to left swipe 
      if (e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { 
       // checking if current index is the last index 
       if (ind == items.size() - 1 || ind > items.size() - 1) { 
        Log.e("Last Index", "Can't move further anymore"); 
        return false; 
       } else { 
        ind++; 
        loadAndShowNextActivity(); 
       } 
      } 
      // left to right 
      else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { 

       if (ind <= 0) { 
        Log.d("First Index", "Can't move back anymore"); 
        return false; 
       } else { 
        ind--; 
        loadAndShowNextActivity(); 
       } 
      } 
     } catch (Exception e) { 
      System.out.println("Exception occured while flinging"); 
      e.printStackTrace(); 
     } 

     return false; 
    } 
} 

然後我在主類中覆蓋了onTouchEvent()函數。這是實現如下:

@Override 

public boolean onTouchEvent(MotionEvent event) { 

    Log.e("Now","onTouchEvent"); 
    if (gestureDetector.onTouchEvent(event)) 
     return true; 
    else 
     return false; 
} 

,然後調用其在主類的onCreate實例如下:

gestureDetector = new GestureDetector(new MyGestureListener()); 
    gestureListener = new View.OnTouchListener() { 
     public boolean onTouch(View v, MotionEvent event) { 
      if (gestureDetector.onTouchEvent(event)) { 
       return true; 
      } 
      return false; 
     } 
    }; 

它不工作,請建議,並確定我要去哪裏錯了。在此先感謝.. :-)

+0

笏錯誤烏爾得到些什麼? – Randroid

+0

@拉胡..沒有錯誤。但功能尚未實現。當我滑過什麼都沒有發生。 –

回答

1

我寫了類似下面

import android.app.Activity; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.GestureDetector; 
import android.view.GestureDetector.OnGestureListener; 
import android.view.GestureDetector.SimpleOnGestureListener; 
import android.view.MotionEvent; 
import android.view.View; 
import android.widget.ImageView; 

public class SwipetestActivity extends Activity{ 
    private static final String LOGID = "CHECKTHISOUT"; 
    public int[] list = {R.drawable.a,R.drawable.b, R.drawable.c, R.drawable.d, R.drawable.e }; 
    private static final int SWIPE_MIN_DISTANCE = 120; 
    private static final int SWIPE_MAX_OFF_PATH = 250; 
    private static final int SWIPE_THRESHOLD_VELOCITY = 200; 
    private GestureDetector gestureDetector; 
    View.OnTouchListener gestureListener; 
    public int i = 0; 

    String message = "Initial Message"; 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     setContentView(R.layout.main); 

     ImageView imageview = (ImageView)findViewById(R.id.imageView1); 
     imageview.setImageResource(list[0]); 

     gestureDetector = new GestureDetector(new MyGestureDetector()); 
    } 

    public class MyGestureDetector extends SimpleOnGestureListener implements OnGestureListener { 
     @Override 
     public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { 
      try { 
       if (Math.abs(e1.getY() - e2.getY()) > SWIPE_MAX_OFF_PATH) 
        return false; 
       // right to left swipe 
       if(e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { 
        ImageView imageview = (ImageView)findViewById(R.id.imageView1); 
        if(list.length>i){ 
         i++; 
        imageview.setImageResource(list[i]); 
        } 
        Log.v(LOGID,"right to left swipe detected"); 


       } // left to right swipe 
       else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { 
        ImageView imageview = (ImageView)findViewById(R.id.imageView1); 
        if(i>0){ 
         i--; 
        imageview.setImageResource(list[i]); 
        } 
        Log.v(LOGID,"left to right swipe detected");      


       } 
      } catch (Exception e) { 
       // nothing 
      } 
      return false; 
     } 
    } 

    // This doesn't work 
    @Override 
    public boolean onTouchEvent(MotionEvent event) { 
     if (gestureDetector.onTouchEvent(event)){ 
      Log.v(LOGID,"screen touched"); 
      return true; 
     } 
     else{ 
      return false; 
     } 
    } 

} 
+0

@Mayu ...我試過這個,但結果是一樣的,模擬器屏幕顯示觸摸的跡象,但不要滑動內容。因爲每次我嘗試交換時都會調用onTouchEvent。它可能是一個模擬器的問題...?它可以在設備上運行良好...? –

+0

如果您檢查logcat,您可以看到交換事件也記錄在模擬器中,但交換(在android中調用它)在真實設備中比仿真器更準確。 –

+0

呃..我會試着用設備... !!! –

1

代碼試試這個

public class Main extends Activity { 

private static final int SWIPE_MIN_DISTANCE = 120; 
private static final int SWIPE_MAX_OFF_PATH = 250; 
private static final int SWIPE_THRESHOLD_VELOCITY = 200; 
private GestureDetector gestureDetector; 
View.OnTouchListener gestureListener; 
private Animation slideLeftIn; 
private Animation slideLeftOut; 
private Animation slideRightIn; 
private Animation slideRightOut; 
private ViewFlipper viewFlipper; 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    viewFlipper = (ViewFlipper)findViewById(R.id.flipper); 
    slideLeftIn = AnimationUtils.loadAnimation(this, R.anim.slide_left_in); 
    slideLeftOut = AnimationUtils.loadAnimation(this, R.anim.slide_left_out); 
    slideRightIn = AnimationUtils.loadAnimation(this, R.anim.slide_right_in); 
    slideRightOut = AnimationUtils.loadAnimation(this, R.anim.slide_right_out); 

    gestureDetector = new GestureDetector(new MyGestureDetector()); 
    gestureListener = new View.OnTouchListener() { 
     public boolean onTouch(View v, MotionEvent event) { 
      if (gestureDetector.onTouchEvent(event)) { 
       return true; 
      } 
      return false; 
     } 
    }; 
} 
class MyGestureDetector extends SimpleOnGestureListener { 
    @Override 
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { 
     try { 
      if (Math.abs(e1.getY() - e2.getY()) > SWIPE_MAX_OFF_PATH) 
       return false; 
      // right to left swipe 
      if(e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { 
       viewFlipper.setInAnimation(slideLeftIn); 
       viewFlipper.setOutAnimation(slideLeftOut); 
       viewFlipper.showNext(); 
      } else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { 
       viewFlipper.setInAnimation(slideRightIn); 
       viewFlipper.setOutAnimation(slideRightOut); 
       viewFlipper.showPrevious(); 
      } 
     } catch (Exception e) { 
      // nothing 
     } 
     return false; 
    } 
} 

@Override 
public boolean onTouchEvent(MotionEvent event) { 
    if (gestureDetector.onTouchEvent(event)) 
     return true; 
    else 
     return false; 
} 
    } 

slide_left_in.xml

   <?xml version="1.0" encoding="utf-8"?> 
     <set xmlns:android="http://schemas.android.com/apk/res/android"> 
      <translate android:fromXDelta="100%p" android:toXDelta="0" android:duration="800"/> 
      </set> 

slide_left_out.xml

    <?xml version="1.0" encoding="utf-8"?> 
       <set xmlns:android="http://schemas.android.com/apk/res/android"> 
      <translate android:fromXDelta="0" android:toXDelta="-100%p" android:duration="800"/> 
      </set> 

slide_right_in.xml

   <?xml version="1.0" encoding="utf-8"?> 
     <set xmlns:android="http://schemas.android.com/apk/res/android"> 
      <translate android:fromXDelta="-100%p" android:toXDelta="0" android:duration="800"/> 
      </set> 

slide_right_out.xml

  <?xml version="1.0" encoding="utf-8"?> 
       <set xmlns:android="http://schemas.android.com/apk/res/android"> 
      <translate android:fromXDelta="0" android:toXDelta="100%p" android:duration="800"/> 
      </set>