无法水平滑动屏幕

时间:2011-08-16 09:11:16

标签: android uigesturerecognizer gesture-recognition

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;
        }
    };  

它不起作用,请建议并确定我哪里出错了。在此先感谢..: - )

2 个答案:

答案 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;
        }
    }

}

答案 1 :(得分: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>