我有框架布局:
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_margin="10dp" >
<LinearLayout
android:id="@+id/widgetView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center"
android:layout_margin="10dp"
android:gravity="center" >
</LinearLayout>
<LinearLayout
android:id="@+id/widgetOverlayFrame"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clickable="false" >
</LinearLayout>
第一个布局包含窗口小部件布局,第二个布局是透明的,并且接收onLongClick用于拖动方法。问题是当我想要与窗口小部件交互时,点击某些内容,点击事件由overlayFrame拍摄。如何将click事件通过overlayFrame传递给widgetView?
编辑:
现在我正在尝试将GestureLister附加到overlayFrame LinearLayout,以某种方式查看代表单击和长按的MotionEvent之间的区别。我面临的问题是手势监听器中的OnLongPress总是被调用,无论我做什么,单击还是长按。
这种行为有解释吗? TNX!
答案 0 :(得分:2)
在我的情况下,我向视图的layoutParams添加了标志,该标志应该已经在以下条件下传递了touch事件:
WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE
这样,视图将忽略所有触摸(例如具有可见性的视图已消失)
答案 1 :(得分:0)
也许设置叠加层的属性android:focusable="false"
或android:focusableInTouchMode="false"
就足够了。
您也可以制作自己的叠加窗口小部件并覆盖其onInterceptTouchEvent
方法,以便始终返回false。
public class NotTouchableLinearLayout extends LinearLayout {
// Override constructors
// ...
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
return false;
}
}
答案 2 :(得分:0)
您应该创建自己的扩展GestureListener
的类并覆盖它的LinearLayout
方法,而不是在顶部布局上设置onTouchEvent
。
在那里你可以实现长按\短按等逻辑。
点击事件将首先发送到窗口小部件布局,并且只有当它不处理它们时(因此onTouchEvent
返回false
),您将在顶部布局上获得它们。 / p>
修改强>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_margin="10dp" >
<LinearLayout
android:id="@+id/widgetView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center"
android:layout_margin="10dp"
android:gravity="center" >
</LinearLayout>
<com.example.touchtesting.MyLinearLayout
android:id="@+id/widgetOverlayFrame"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clickable="false" >
</com.example.touchtesting.MyLinearLayout>
</FrameLayout>
将com.example.touchtesting
更改为您的包名称。
这是班级:
public class MyLinearLayout extends LinearLayout{
public MyLinearLayout(Context context, AttributeSet attrs) {
super(context, attrs);
}
private long startClick = 0;
@Override
public boolean onTouchEvent(MotionEvent ev) {
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
startClick = ev.getEventTime();
break;
case MotionEvent.ACTION_CANCEL:
case MotionEvent.ACTION_UP:
if (ev.getEventTime() - startClick < 500) {
Log.i("example","short click");
}
else {
Log.i("example","long click");
}
break;
}
return true;
}
}
答案 3 :(得分:0)
您可以用这种方式覆盖onTouchListener,而不是使用GestureListener。
这将在计时器用完时调用longPress,如果它之间有一个up,它将取消LongPress
CountDownTimer c;
long time=5000;
@Override
public boolean onTouchEvent(MotionEvent ev) {
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
c= new CountDownTimer(5000, 1000) {
public void onTick(long millisUntilFinished) {
time=millisUntilFinished;
}
public void onFinish() {
Log.i("","LONG PRESS");
}}.start();
break;
case MotionEvent.ACTION_UP:
if (time>0) {
Log.i("example","short click");
c.cancel();
}
break;
}
return true;
}
答案 4 :(得分:0)
要获得长时间点击以通过widgetView LinearLayout
添加android:longClickable="true"
。 (对于普通点击,请添加android:clickable="true"
)
所以widgetView变为:
<LinearLayout
android:id="@+id/widgetView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center"
android:layout_margin="10dp"
android:gravity="center"
android:longClickable="true">
</LinearLayout>