onTouch() 未调用父布局
onTouch() not called for parent layout
我有这样的布局:
LinearLayout
RelativeLayout(id = test)
FrameLayout (From a LIB. id = lib)
我尝试将 onTouchListener()
添加到 test
但它不起作用。
我试过了:
@OnTouch(R.id.test)
public boolean test(View v,MotionEvent e) { NOT WORK }
我尝试了一个简单的侦听器:
test.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
NOT WORK
return false;
}
});
我尝试向 FrameLayout
添加侦听器,但也不起作用。
我不想修改库。
有人知道使用 OnTouch
事件吗?
<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
在 CameraView 中:
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;
}
});
谢谢。
解法:
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
-> CameraView:dispatchTouchEvent (return true) STOPPED everything
解决方案:
Touch
-> Activity:dispatchTouchEvent
-> LinearLayout:dispatchTouchEvent
-> CustomRelativeLayout:dispatchTouchEvent
-> CustomRelativeLayout:onTouch
-> LinearLayout:onTouch
-> Activity:onTouch (IT WORK :))
我认为您的 RelativeLayout 已被 FrameLyout 覆盖,这就是触摸不起作用的原因。
Post 你的布局 xml 代码
很可能FrameLayout
消耗了触摸事件。一旦触摸事件被任何视图使用,该事件将不会被分派给父视图。如果 FrameLayout
附加了点击侦听器,则 MotionEvent
将不会到达 RelativeLayout
。
您可以子类化 RelativeLayout
,覆盖 ViewGroup#dispatchTouchEvent(MotionEvent)
并跟踪将分派给该布局的子级的 MotionEvent
(在您的例子中是 FrameLayout
)。
在那种情况下,您的视图层次结构将是这个:
<LinearLayout>
<com.example.CustomRelativeLayout>
<FrameLayout>
</com.example.CustomRelativeLayout>
</LinearLayout>
我有这样的布局:
LinearLayout
RelativeLayout(id = test)
FrameLayout (From a LIB. id = lib)
我尝试将 onTouchListener()
添加到 test
但它不起作用。
我试过了:
@OnTouch(R.id.test)
public boolean test(View v,MotionEvent e) { NOT WORK }
我尝试了一个简单的侦听器:
test.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
NOT WORK
return false;
}
});
我尝试向 FrameLayout
添加侦听器,但也不起作用。
我不想修改库。
有人知道使用 OnTouch
事件吗?
<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
在 CameraView 中:
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;
}
});
谢谢。
解法:
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
-> CameraView:dispatchTouchEvent (return true) STOPPED everything
解决方案:
Touch
-> Activity:dispatchTouchEvent
-> LinearLayout:dispatchTouchEvent
-> CustomRelativeLayout:dispatchTouchEvent
-> CustomRelativeLayout:onTouch
-> LinearLayout:onTouch
-> Activity:onTouch (IT WORK :))
我认为您的 RelativeLayout 已被 FrameLyout 覆盖,这就是触摸不起作用的原因。 Post 你的布局 xml 代码
很可能FrameLayout
消耗了触摸事件。一旦触摸事件被任何视图使用,该事件将不会被分派给父视图。如果 FrameLayout
附加了点击侦听器,则 MotionEvent
将不会到达 RelativeLayout
。
您可以子类化 RelativeLayout
,覆盖 ViewGroup#dispatchTouchEvent(MotionEvent)
并跟踪将分派给该布局的子级的 MotionEvent
(在您的例子中是 FrameLayout
)。
在那种情况下,您的视图层次结构将是这个:
<LinearLayout>
<com.example.CustomRelativeLayout>
<FrameLayout>
</com.example.CustomRelativeLayout>
</LinearLayout>