Android:从左向右、从右向左滑动

发布于 2024-12-01 15:04:52 字数 4295 浏览 1 评论 0原文

我是 Android 新手,我正在尝试制作一个页面,可以从左向右和从右向左滑动以转到上一页和下一页。我花了很多时间查找并尝试不同的东西。由于某种原因,当我滑动(无论向哪个方向)时,它只显示下一张图片。当我从右向左滑动时,它应该显示上一张图片。任何帮助将不胜感激!非常感谢您的宝贵时间:)

public class MyGestureDetector extends SimpleOnGestureListener
{
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;
public boolean isRightToLeft = false;

@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
     // right to left swipe
        if(e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
            isRightToLeft = true;
            return true;
        }               
       // left to right swipe
        else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
            isRightToLeft = false;
            return true;

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

}






public class Pictures extends Activity 
{
private int pictureCounter = 1;
private Context myContext = this;
private GestureDetector gestureDetector;
View.OnTouchListener gestureListener;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) 
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.pictures);
    getPicture(pictureCounter);


    final MyGestureDetector myGestureDetector = new MyGestureDetector(); 
    // Gesture detection
    gestureDetector = new GestureDetector(myGestureDetector);
    gestureListener = new View.OnTouchListener() {
        public boolean onTouch(View v, MotionEvent event) {
            if (gestureDetector.onTouchEvent(event)) {
                if (myGestureDetector.isRightToLeft)
                {
                    previousPicture();
                }
                else if (!myGestureDetector.isRightToLeft)
                {
                    nextPicture();
                }
                return true;
            }
            return false;
        }
    };
    //iv.setOnTouchListener(gestureListener);
    ((ImageView)findViewById(R.id.title_pictures)).setOnTouchListener(gestureListener);


    ImageView iv = (ImageView) findViewById(R.id.flag_pic);
    iv.setOnClickListener(new OnClickListener()
    {

        public void onClick(View arg0) 
        {
            // TODO Auto-generated method stub
            nextPicture();
        }
    });
}

public void getPicture(int picCounter)
{
    DatabaseHelper myDbHelper = new DatabaseHelper(this);

    try
    {
        myDbHelper.createDatabase();
    }
    catch (IOException ioe)
    {
        throw new Error("Unable to create databse");
    }

    try
    {
        myDbHelper.openDatabase();
    }
    catch(SQLException sqle)
    {
        throw sqle;
    }

    String query = "select Before_Picture, After_Picture from picture_mapping where _id = " + picCounter;

    SQLiteDatabase db = myDbHelper.getReadableDatabase();

    Cursor cursor = db.rawQuery(query, null);
    cursor.moveToFirst();
    String beforePicture = cursor.getString(0);
    String afterPicture = cursor.getString(1);

    cursor.close();
    db.close();

    ImageView before_pic = (ImageView) findViewById(R.id.imgView_before_pic);
    int resId = myContext.getResources().getIdentifier(beforePicture,"drawable", "com.ash.android.pictures");
    before_pic.setBackgroundResource(resId);

    TextView after_pic = (TextView) findViewById(R.id.txtView_after_picture);
    after_pic.setText(afterPicture);
    //Toast toast=Toast.makeText(this, beforePicture+ ":" + afterPicture, Toast.LENGTH_LONG);  
    //toast.show();  



}

public void nextPicture()
{
    if (pictureCounter < 36)
    {
        pictureCounter += 1;
        getPicture(pictureCounter);
    }
    else
    {
        //do nothing
    }
}

public void previousPicture()
{
    if (pictureCounter > 1)
    {
        pictureCounter -= 1;
        getPicture(pictureCounter);
    }
    else
    {
        //do nothing
    }

 }
}

提前致谢!

I am new to Android, and I am trying to make a page where I can swipe from left to right and right to left to go to previous and next pages. I spent a lot of time looking up and trying different things. For some reason, when I swipe (no matter which direction), it only shows next picture. It should have shown me previous picture when I swipe right to left. Any help will be highly appreciated! Thanks so much for your time :)

public class MyGestureDetector extends SimpleOnGestureListener
{
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;
public boolean isRightToLeft = false;

@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
     // right to left swipe
        if(e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
            isRightToLeft = true;
            return true;
        }               
       // left to right swipe
        else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
            isRightToLeft = false;
            return true;

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

}






public class Pictures extends Activity 
{
private int pictureCounter = 1;
private Context myContext = this;
private GestureDetector gestureDetector;
View.OnTouchListener gestureListener;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) 
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.pictures);
    getPicture(pictureCounter);


    final MyGestureDetector myGestureDetector = new MyGestureDetector(); 
    // Gesture detection
    gestureDetector = new GestureDetector(myGestureDetector);
    gestureListener = new View.OnTouchListener() {
        public boolean onTouch(View v, MotionEvent event) {
            if (gestureDetector.onTouchEvent(event)) {
                if (myGestureDetector.isRightToLeft)
                {
                    previousPicture();
                }
                else if (!myGestureDetector.isRightToLeft)
                {
                    nextPicture();
                }
                return true;
            }
            return false;
        }
    };
    //iv.setOnTouchListener(gestureListener);
    ((ImageView)findViewById(R.id.title_pictures)).setOnTouchListener(gestureListener);


    ImageView iv = (ImageView) findViewById(R.id.flag_pic);
    iv.setOnClickListener(new OnClickListener()
    {

        public void onClick(View arg0) 
        {
            // TODO Auto-generated method stub
            nextPicture();
        }
    });
}

public void getPicture(int picCounter)
{
    DatabaseHelper myDbHelper = new DatabaseHelper(this);

    try
    {
        myDbHelper.createDatabase();
    }
    catch (IOException ioe)
    {
        throw new Error("Unable to create databse");
    }

    try
    {
        myDbHelper.openDatabase();
    }
    catch(SQLException sqle)
    {
        throw sqle;
    }

    String query = "select Before_Picture, After_Picture from picture_mapping where _id = " + picCounter;

    SQLiteDatabase db = myDbHelper.getReadableDatabase();

    Cursor cursor = db.rawQuery(query, null);
    cursor.moveToFirst();
    String beforePicture = cursor.getString(0);
    String afterPicture = cursor.getString(1);

    cursor.close();
    db.close();

    ImageView before_pic = (ImageView) findViewById(R.id.imgView_before_pic);
    int resId = myContext.getResources().getIdentifier(beforePicture,"drawable", "com.ash.android.pictures");
    before_pic.setBackgroundResource(resId);

    TextView after_pic = (TextView) findViewById(R.id.txtView_after_picture);
    after_pic.setText(afterPicture);
    //Toast toast=Toast.makeText(this, beforePicture+ ":" + afterPicture, Toast.LENGTH_LONG);  
    //toast.show();  



}

public void nextPicture()
{
    if (pictureCounter < 36)
    {
        pictureCounter += 1;
        getPicture(pictureCounter);
    }
    else
    {
        //do nothing
    }
}

public void previousPicture()
{
    if (pictureCounter > 1)
    {
        pictureCounter -= 1;
        getPicture(pictureCounter);
    }
    else
    {
        //do nothing
    }

 }
}

Thanks in advance!!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

彻夜缠绵 2024-12-08 15:04:52

注释掉

iv.setOnClickListener

你的活动中的 ,我认为这次狂欢应该有效。

Comment out the

iv.setOnClickListener

in your activity and I think the fling should be working.

如此安好 2024-12-08 15:04:52

抱歉,我不是知识渊博,实际上我自己正在尝试解决这个问题...我正在使用 titan api 来编程,所以我不熟悉你的代码的语法,尽管我明白了总体思路...(我的实习仍在为期 2 周的培训期间)

不过,我很早就看到了以下代码行,

//right to left swipe
if(e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
    isRightToLeft = true;
    return true;
}               
// left to right swipe
else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
    isRightToLeft = false;
    return true;
}

看起来您的方程

if(e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX)

可以检测到滑动...但是 ABS() 函数将导致您仅解释滑动的幅度,并且无法辨别方向的差异。希望这有帮助!

Sorry I am not super knowledgable and am actually trying to work on this question myself... I am using titanium api in order to program so I am not familiar with the syntax of your code, though I get the general idea... (Still on a 2 week training period for my internship)

TO THE POINT THOUGH, I see the following lines of code pretty early on

//right to left swipe
if(e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
    isRightToLeft = true;
    return true;
}               
// left to right swipe
else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
    isRightToLeft = false;
    return true;
}

It looks like your equation

if(e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX)

will work to detect a swipe... However the ABS() function in your code will cause you to only interpret the magnitude of the swipe, and will be unable to tell a difference in direction. Hope this helps!

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文