我有一个难题。我正在用Android编写游戏,在每个游戏开始时我都会显示“提示”。小贴士是一个带有一些文字的盒子和一个小的“x”按钮来关闭它。但是我不希望玩家必须点击x按钮,所以我做了它,所以整个游戏板拦截点击事件并在第一次点击时关闭提示框。
为此,我覆盖了游戏板所在的onInterceptTouchEvent
中的RelativeLayout
方法来调用方法来关闭提示框,然后允许点击事件过滤到任何孩子被点击。
我的问题是,除了提示框的“X”按钮之外,其他地方都可以。重启按钮恰好位于“X”按钮下方。因此,如果您尝试单击“X”按钮关闭提示,RelativeLayout会看到click事件,调用方法关闭提示框,并且因为“X”按钮不再存在,重启按钮结束被点击(以一种美味的讽刺方式重新启动游戏并提出另一个提示!)。
我无法找到一个干净,愉快的方法来解决这个问题。
这是我的onIntercept方法:
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
if (closeBubbleOnNextClick) {
gameboardActivity.onCloseSpeechBubble(null);
closeBubbleOnNextClick = false;
}
return false;
}
如果提示的“X”按钮是目标,我无法从MotionEvent
中获取目标视图以不关闭提示。我真的不想在该方法中禁用重置按钮,因为根据设备大小,“X”按钮可能完全在不同的按钮上(如主页按钮),我看不到好的方法无论如何都要创建一个回叫来重新打开它。
我不想做一些事情,比如运行方法来关闭在单独的线程上延迟的提示按钮,因为它会导致一个奇怪的延迟,当提示框消失,或者容易失败取决于设备性能。
有没有人知道在任何点击上关闭提示框的简洁方法,除了提示框的“X”按钮上的点击?
这是提示框。它只是一个FrameLayout
,里面有一些视图。
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/speech_bubble_wrapper"
style="@style/TutorialBubble"
android:padding="@dimen/default_margin"
android:layout_width="wrap_content"
android:layout_height="wrap_content" >
<!--
Ideally, the x button's touch box should be increased in size
whenever this view is inflated
-->
<ImageView
android:id="@+id/speech_bubble_image"
android:layout_width="@dimen/speech_bubble_width"
android:layout_height="wrap_content"
android:adjustViewBounds="true"
android:src="@drawable/speech_bubble" />
<com.ponyseeker.models.ui.PonyTextView
android:id="@+id/speech_bubble_text"
style="@style/PonyFontBody"
android:layout_width="@dimen/speech_bubble_width"
android:layout_gravity="center_horizontal"
android:padding="@dimen/speech_bubble_text_margin"
android:textSize="@dimen/speech_bubble_text_size" />
<ImageView
android:id="@+id/speech_bubble_x"
android:layout_width="@dimen/speech_bubble_x_width"
android:layout_height="wrap_content"
android:layout_gravity="top|right"
android:adjustViewBounds="true"
android:onClick="onCloseSpeechBubble"
android:src="@drawable/speech_bubble_x" />
</FrameLayout>