1

我正在尝试实现一个自定义视图,用户可以在其中用手指绘制。基本上,我正在关注本教程

一切似乎都很好,但是,鉴于我在自定义视图下方还有 2 个按钮,如下所示:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/background_color"
    tools:context=".MainActivity" 
    android:id="@+id/mainScreen" >

    <Button
        android:id="@+id/buttonSave"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentBottom="true"
        android:text="@string/save" />

    <Button
        android:id="@+id/buttonQuery"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_alignParentBottom="true"
        android:text="@string/query" />

    <com.example.myapp.DrawView
        android:id="@+id/drawView"
        android:background="@color/red"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:layout_above="@id/buttonSave" />

</RelativeLayout>

它实际上甚至在按钮下方绘制,我很难理解为什么它不只捕获发生在 DrawView 而不是在它之外的触摸事件。基本上,我不能从按钮上方开始画线,但是一旦我开始在我的视图上绘图,我什至可以将线延伸到它之外。

据我所知,DrawView 不会在按钮下方溢出,如此处所讨论的,所以我想弄清楚发生了什么。我真的必须检查事件是否超出范围吗?它实际上是否将所有触摸事件委托给当前聚焦的视图?有没有办法改变这种行为?

这个简单的教程没有描述的问题,但它逐点绘制。


更新:调试应用程序时,我确定 drawView 的大小为 480x728,而 mainScreen 的大小为 480x800,因此它们不重叠。一旦获得焦点,即使它们在drawView之外触发,它也会继续注册触摸事件。这是我试图避免的,最好不要通过一个大的 if 语句传递事件坐标......

4

2 回答 2

0

如果您不希望按钮重叠,DrawView则使用 aLinearLayout将所有Views 分开。目前,从 XML 布局来看(并假设在代码中以编程方式布局没有任何奇怪的地方),您的按钮DrawView.

我的印象是您将两个按钮并排放置在顶部,并DrawView填充下方的剩余屏幕区域。为此,请使用LinearLayout垂直方向的外部容器。它的第一个孩子是另一个LinearLayout水平方向的孩子,包含两个按钮。内部的第二个孩子LinearLayoutDrawView. 使用宽度、高度和重量属性来获得所需的尺寸。(或者,另一种方法是保留您拥有的 XML 布局结构,但在 上设置一些上边距DrawView以等于按钮的高度,这可以在 XML 布局中固定,或以编程方式完成。)

编辑对不起,我完全错过了这个layout_above属性,这使我的第二句话无效。在那种情况下,我不确定目前是否无法启动 Eclipse。LinearLayout无论如何尝试建议的方法。

于 2012-07-31T16:32:08.500 回答
0

事实证明,这是 Android 模拟器显示界面的方式中的一些奇怪的错误。它可能会在真实设备上执行类似的操作(甚至在侦听器视图之外抛出触摸事件),但由于它将显示限制为drawView,我可以安全地忽略它们,因为我只需要从drawView. 但是,它可能会在其他应用程序中引起大麻烦……

于 2012-08-07T16:28:31.887 回答