7

水平スクロール用のカスタム ギャラリー ビューと、すべてクリック可能ないくつかの子ビューがあります。

常にタッチイベントを消費するため、設定childview.setOnClickListener()は機能しません。

したがって、childview.setOnTouchListener()ギャラリーがスクロール可能になるように、onTouch メソッドを使用して false を返すようにしました。

これで問題ありません。

問題は、childView の onTouch メソッドがACTION_DOWNイベントのみを発生させることです。を設定してビューをクリック可能にしない限り、 MotionEvent ACTION_UPは渡されませんchildview.setClickable()。ただし、ビューをクリック可能に設定すること自体が onTouch イベントを消費するように見えるため、ギャラリー ビューはスクロールできなくなります。

ここで輪になっていくようです。どんな助けにも感謝します。

これが私のコードです

ギャラリー ビュー:

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() - リスナーがこのイベントを消費するかどうかを示すブール値を返します。重要なことは、このイベントには、互いに続く複数のアクションを含めることができるということです。したがって、ダウン アクション イベントを受信したときに false を返す場合は、イベントを消費しておらず、このイベントからの後続のアクションにも関心がないことを示します。したがって、指のジェスチャーや最終的なアップ アクション イベントなど、イベント内の他のアクションに対して呼び出されることはありません。

Android dev GUID から

于 2012-04-14T12:01:12.760 に答える