7

我有一个用于水平滚动的自定义库视图和几个子视图,它们都应该是可点击的。

设置childview.setOnClickListener()不起作用,因为它总是消耗触摸事件。

因此,我使用childview.setOnTouchListener()并让它的onTouch 方法返回false,这样Gallery 就可以滚动了。

这一切都很好。

现在的问题是,childView 的 onTouch 方法只触发ACTION_DOWN事件。除非我通过设置使 View 可点击,否则它不会传递MotionEvent ACTION_UPchildview.setClickable()。但是,设置 View clickable 本身似乎会消耗 onTouch 事件,因此画廊 View 变得不可滚动。

好像我在这里转了一圈。我会很感激任何帮助。

这是我的代码

画廊视图:

public class myGallery extends Gallery {

    public myGallery(Context ctx, AttributeSet attrSet) {
        super(ctx, attrSet);
        // TODO Auto-generated constructor stub
    }

    private boolean isScrollingLeft(MotionEvent e1, MotionEvent e2){ 
           return e2.getX() > e1.getX(); 
        }

    @Override
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY){
      int kEvent;
      if(isScrollingLeft(e1, e2)){ //Check if scrolling left
        kEvent = KeyEvent.KEYCODE_DPAD_LEFT;
      }else{ //Otherwise scrolling right
        kEvent = KeyEvent.KEYCODE_DPAD_RIGHT;
      }
      onKeyDown(kEvent, null);
      return true;  
    }
}

在我的活动中:

gallery.setOnItemSelectedListener(new OnItemSelectedListener(){
     public void onItemSelected(AdapterView<?> parent, View view,
                    int position, long id) {


         //  childView.setClickable(true);   // can't use this
                                             // click event would get consumed
                                            // and gallery would not scroll 

         // therefore, I can only use the ACTION_DOWN event below:

         childView.setOnTouchListener(new OnTouchListener() {
              public boolean onTouch(View v, MotionEvent event) {

              switch (event.getAction()) {
                  case MotionEvent.ACTION_DOWN:
                       //doStuff();
              }

              return false;
              }
         });
    }

    public void onNothingSelected(AdapterView<?> arg0) {}
     });
}
4

2 回答 2

4

如果我是你,我会尝试覆盖ViewGroup.onInterceptTouchEvent(...)方法而不是设置OnTouchListener。这样,您应该能够在不实际使用它们的情况下拦截触摸事件。

查看 javadoc

于 2013-06-02T20:11:11.663 回答
0

OnTouch 需要返回 true 以指示您想要其余的事件。这是一个摘录:

•onTouch() - 这将返回一个布尔值来指示您的侦听器是否使用此事件。重要的是这个事件可以有多个相互跟随的动作。因此,如果在接收到 down 操作事件时返回 false,则表明您尚未消费该事件,并且对该事件的后续操作也不感兴趣。因此,事件中的任何其他操作都不会调用您,例如手指手势或最终的向上操作事件。

来自 android 开发指南

于 2012-04-14T12:01:12.760 回答