【问题标题】:Trying to get OnFling to work试图让 OnFling 工作
【发布时间】:2013-01-06 08:34:10
【问题描述】:

我知道有很多关于这个话题的问题。我已经看过其中的大多数,但我仍然无法调试我的代码。它不检测滑动。我是 Android 编程和 Java 的初学者,所以请不要太挑剔。

  • 我有一个简单的线性布局,带有一个填充整个布局的按钮。每次单击按钮时,其值都会增加 1。
  • 我正在尝试实现向左向右滑动。我的基本疑问是我应该使用按钮还是线性布局来实现 setOnTouchListener?
  • 我见过人们使用 OnGestureListener 和 OnTouchListener。哪一个更可取?

    public class MainActivity extends Activity implements OnClickListener{
    
    public Button increment;
    public int cnt= 0;
    private static final int SWIPE_MIN_DISTANCE = 80;
    private static final int SWIPE_THRESHOLD_VELOCITY = 40;
    GestureDetector gestureDetector;
    LinearLayout swipe_layout= (LinearLayout)findViewById(R.id.linear);
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    
        increment= (Button)findViewById(R.id.numberkey);
        increment.setOnClickListener(this);
        setDisplay(0);
        gestureDetector= new GestureDetector(this, new Detector());
        increment.setOnTouchListener(new OnTouchListener() {
    
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                gestureDetector.onTouchEvent(event);
                return true;
            }
        });
    
    }
    
    @Override
    public void onClick(View v) 
    {
        setDisplay(cnt++);
    }
    
    private void setDisplay(int i) 
    {   increment.setText(String.valueOf(i));
    }
    
    class Detector extends SimpleOnGestureListener {
    
    @Override
        public boolean onDown(MotionEvent e) {
            return true;
        }
    
    
        @Override
        public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float            velocityY) {
                // right to left swipe
                if(e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY)
                   Toast.makeText(MainActivity.this, "Left Swipe", Toast.LENGTH_SHORT).show();
    
                else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
                    Toast.makeText(MainActivity.this, "Right Swipe", Toast.LENGTH_SHORT).show();
                }
            return false;
        }
    
    }
    

    }

提前致谢。

【问题讨论】:

  • 但是我应该用布局而不是按钮调用 onTouchListener 吗?按钮填充整个布局。
  • 是的,你可以用 layout 来调用它

标签: android swipe touch-event uiswipegesturerecognizer swipe-gesture


【解决方案1】:

移动

LinearLayout swipe_layout= (LinearLayout)findViewById(R.id.linear); 

在 Activity 的setContentView(R.layout.activity_main); 之后,因为您试图在为当前 Activity 设置布局之前找到视图

并将布局的onTouchListener 设置为:

LinearLayout swipe_layout;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    swipe_layout= (LinearLayout)findViewById(R.id.linear);

    swipe_layout.setOnTouchListener(new OnTouchListener() {

     @Override
       public boolean onTouch(View v, MotionEvent event) {

         return true;
    }
  });

【讨论】:

  • 仍然,滑动不起作用,吐司没有出现。它把我的滑动手势当作简单的点击。我在这里做错了什么?
  • @Chocolava : 见 this 帖子
  • 不,不是,我尝试了那个人所做的一切。具体来说,您能告诉我我们应该从 onTouch 方法中返回 true 还是 false 吗?
  • 因为在那个线程中,那个家伙写的代码,他从方法中返回了false。
  • @Chocolava :是的,您也可以从 onTouch 返回 false。你有没有在给定的线程中尝试过合理的答案
猜你喜欢
  • 1970-01-01
  • 2019-02-01
  • 2011-04-13
  • 2015-09-07
  • 1970-01-01
  • 1970-01-01
  • 2014-03-02
  • 2011-10-02
  • 2015-10-21
相关资源
最近更新 更多