【问题标题】:Swipe Detection and Click Detection滑动检测和点击检测
【发布时间】:2019-02-27 01:22:36
【问题描述】:

我目前正在 Android 上构建应用程序。现在请记住,我是一个非常业余的人,但我已经能够弄清楚我需要为我的非常简单的应用程序弄清楚的大部分内容。但是这个问题一直困扰着我,我找不到解决办法。

对于背景,我一直在使用左右滑动来“滚动”不同的文本选项。但是,我想在每次单击时更改一个完全不同的文本字段。

例如,当我滑动时 textview1 会发生变化,而每次单击时 textview2 都会发生变化。但他们在同一页上。

我的代码适用于滑动,但是当我单击时,它执行的功能与我向右滑动时相同。

这是我正在使用的代码,任何关于我做错了什么的帮助将不胜感激:

final float len = getResources().getDisplayMetrics().densityDpi/6;

linear1.setOnTouchListener(new View.OnTouchListener() {
                float initX;
                float initY;
                @Override
                public boolean onTouch(View v, MotionEvent event) {
                    switch(event.getAction()) {
                        case MotionEvent.ACTION_DOWN:
                            initX = event.getX();
                            initY = event.getY();
                            break;
                        case MotionEvent.ACTION_UP:
                            initX -= event.getX();
                            initY -= event.getY();
                            if (initY > len) {

//Logic For Swipe Right


                            } else if(initY < -len) {

               //Logic For Swipe Left   

                            } else {
                                if(initY < 0) initY = -initY;
                                if(initX < 0) initX = -initX;
                                if(initX <= len/4 && initY <= len/4) {

 //Logic For OnClick   

                                }
                            }
                            break;
                    }
                    return true;
                }
});

另一个小问题是它也检测到上下滑动。向下滑动执行右侧滑动应该执行的操作,向上滑动执行左侧滑动应该执行的操作。我只想要左右滑动检测,根本不需要上下滑动检测。

提前谢谢大家!希望你能帮助这个菜鸟!

【问题讨论】:

  • 一次只做一个问题。请不要在您的问题上加上“另一个问题”。
  • 好的,我很抱歉。谢谢你告诉我

标签: javascript java android


【解决方案1】:

在您的onTouch() 方法中,您可以检查事件的起源是否触及您的textview2 TextView。在这种情况下,忽略该事件并让您的 textview2 的 onClick() 方法处理它:

linear1.setOnTouchListener(new View.OnTouchListener() {
                float initX;
                float initY;
                @Override
                public boolean onTouch(View v, MotionEvent event) {

                    if (v == textview2) {
                        return;
                    }

                    switch(event.getAction()) {
                        case MotionEvent.ACTION_DOWN:
                            initX = event.getX();
                            initY = event.getY();
                            break;
                        case MotionEvent.ACTION_UP:
                            initX -= event.getX();
                            initY -= event.getY();
                            if (initY > len) {
                                //Logic For Swipe Right
                            } else if(initY < -len) {
                                //Logic For Swipe Left   
                            }
                            break;
                     }
                     return true;
                }
});

【讨论】:

  • 我正在尝试对其进行编码,以便在 linear1 上我触摸它的任何地方都会更改 textview2,而在 linear1 上我滑动它的任何地方都会更改 textview1。您引用的代码是否实现了这一点?抱歉,但我认为这整个编码事情都超出了我的想象,所以如果我的问题看起来很无聊,我很抱歉大声笑
  • 我已经更新了代码,所以当使用触及你的 linear1 组件时,该事件被忽略
  • 它仍然无法正常工作,请您向我解释一下,以便我解决这个问题吗?我越来越绝望了
  • 您已接受答案。你还在寻求帮助吗?
【解决方案2】:

您需要为点击事件实现onClickListener。 onTouchListener 对于这种情况是不够的(因为它旨在处理完全不同的事件类型)。

(已更新) 会是这样的:

linear1.setOnClickListener( new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        // Do things here, this will be run when the element is clicked
    }
});

已更新(根据请求):您的 onTouchListener 现在应该(afaict)包含此内容:

linear1.setOnTouchListener(new View.OnTouchListener() {
                float initX;
                float initY;
                @Override
                public boolean onTouch(View v, MotionEvent event) {
                    switch(event.getAction()) {
                        case MotionEvent.ACTION_DOWN:
                            initX = event.getX();
                            initY = event.getY();
                            break;
                        case MotionEvent.ACTION_UP:
                            initX -= event.getX();
                            initY -= event.getY();
                            if (initY > len) {
                                //Logic For Swipe Right
                            } else if(initY < -len) {
                                //Logic For Swipe Left   
                            }
                            break;
                     }
                     return true;
                }
});

希望这会有所帮助,

【讨论】:

  • 如果这是一个愚蠢的问题,我很抱歉,但是我添加了您按原样放置的代码?我不熟悉 onClickListener。我对代码非常缺乏经验。
  • @Ammer12 更新了我的答案,使其更简洁一些,希望能帮助您理解
  • 这更有意义,谢谢你让我更容易理解。我需要删除原始代码的任何部分吗?因为我试过了,当我点击linear1时它仍然在执行向右滑动的功能。
  • 您可以删除整个 else 声明,其中您有评论:'//Logic For OnClick'
  • 好的,确认一下,我会在 "break;" 之前将它从 else { to } } 中删除?即'else { if(initY
猜你喜欢
  • 2015-08-25
  • 2017-03-02
  • 2013-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多