2

のために呼び出されません。onTouchは()私はこのようなレイアウトを持つ親のレイアウト

私が試した:

@OnTouch(R.id.test) 
public boolean test(View v,MotionEvent e) { NOT WORK } 

を、私は、単純なリスナーみました:私はFrameLayoutにリスナーを追加しようとしましたが、あまりにも動作しません

test.setOnTouchListener(new View.OnTouchListener() { 
       @Override 
       public boolean onTouch(View v, MotionEvent event) { 
NOT WORK 
        return false; 
       } 
      }); 

を。

ライブラリを変更したくありません。 誰でもOnTouchイベントを使用すると思われますか? CameraViewで

<RelativeLayout 
    android:id="@+id/camera_preview" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:background="@android:color/black" 
    android:layout_weight="1"> 

     <com.flurgle.camerakit.CameraView 
      android:id="@+id/camera" 
      android:layout_width="fill_parent" 
      android:layout_height="fill_parent" 
      android:layout_gravity="center_horizontal" 
      android:adjustViewBounds="true" 
      app:ckCropOutput="false" 
      app:ckFacing="back" 
      app:ckFlash="off" 
      app:ckFocus="continuous" 
      app:ckJpegQuality="100" 
      app:ckMethod="standard"/> 

    <TextView 

focusMarkerLayout.setOnTouchListener(new OnTouchListener() { 
     @Override 
     public boolean onTouch(View v, MotionEvent motionEvent) { 
      int action = motionEvent.getAction(); 
      if (motionEvent.getAction() == MotionEvent.ACTION_UP && mFocus == CameraKit.Constants.FOCUS_TAP_WITH_MARKER) { 
       focusMarkerLayout.focus(motionEvent.getX(), motionEvent.getY()); 
      } 

      mPreviewImpl.getView().dispatchTouchEvent(motionEvent); 
      return true; 
     } 
    }); 

感謝。


ソリューション:

Touch 
-> Activity:dispatchTouchEvent 
-> LinearLayout:dispatchTouchEvent 
-> CustomRelativeLayout:dispatchTouchEvent 
-> CameraView:dispatchTouchEvent (return true) STOPPED everything 
0:


LinearLayout 
    RelativeLayout(id = test) 
     CustomRelativeLayout() 
      FrameLayout (From a LIB. id = lib) 

CustomRelativeLayout

public class CustomRelativeLayout extends RelativeLayout{ 
    public CustomRelativeLayout(Context context) { 
     super(context); 
    } 

    public CustomRelativeLayout(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    public CustomRelativeLayout(Context context, AttributeSet attrs, int defStyleAttr) { 
     super(context, attrs, defStyleAttr); 
    } 

    public CustomRelativeLayout(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { 
     super(context, attrs, defStyleAttr, defStyleRes); 
    } 

    @Override 
    public boolean dispatchTouchEvent(MotionEvent ev) { 
     return false; 
    } 
} 

問題を作成します。

ソリューション:

Touch 
-> Activity:dispatchTouchEvent 
-> LinearLayout:dispatchTouchEvent 
-> CustomRelativeLayout:dispatchTouchEvent 
-> CustomRelativeLayout:onTouch 
-> LinearLayout:onTouch 
-> Activity:onTouch (IT WORK :)) 

答えて

2

おそらくFrameLayoutがタッチイベントを消費します。いずれのビューでもタッチイベントが消費されると、そのイベントは親に送出されません。 FrameLayoutにクリックリスナーが接続されている場合、MotionEventRelativeLayoutに届きません。

あなたは、RelativeLayoutをサブクラスViewGroup#dispatchTouchEvent(MotionEvent)をオーバーライドして(あなたのケースFrameLayoutに)そのレイアウトの子どもたちに派遣されますMotionEventを追跡することができます。

その場合は、あなたのビュー階層は、この1のようになります。

<LinearLayout> 
    <com.example.CustomRelativeLayout> 
     <FrameLayout> 
    </com.example.CustomRelativeLayout> 
</LinearLayout> 
+0

@Overrideでカスタムレイアウトを行った public boolean dispatchTouchEvent(MotionEvent ev){ falseを返します。 } でも動作しません – ketom

+0

これは 'MotionEvent'のデバッグに役立ち、何が起きているかを見るのに役立ちます。また、 'false'を返すことで、' MotionEvent'を子にディスパッチすることはできません。代わりに、 'FrameLayout'がクリックを処理できるように' true'を返します。 – azizbekian

+0

CustomLayoutsディスパッチは、画面に触れると実行されます。 – ketom

0

は、私はあなたのRelativeLayoutはタッチが動作していない理由ですFrameLyoutによって上書きされると思います。 レイアウトのXMLコード

+0

私のコードがあります。 – ketom

関連する問題