[英]Custom View Touch Events
我正在尝试实现一个自定义视图,用户可以在其中用手指绘画。 基本上,我正在学习本教程 。
一切似乎都运行良好,但是,考虑到我在自定义视图下还有两个按钮的事实,如下所示:
<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不会在按钮下方溢出,所以我想知道发生了什么。 我真的需要检查事件是否超出范围吗? 它实际上是否将所有触摸事件都委派给当前聚焦的视图? 有什么办法可以改变这种行为?
这个简单的教程没有所描述的问题,但是它逐点绘制。
更新:调试应用程序后,我确定drawView的大小为480x728,而mainScreen的大小为480x800,因此它们不会重叠。 一旦获得焦点,即使在drawView之外触发触摸事件,它也会继续注册。 这就是我要避免的事情,并且最好不要通过大的if语句传递事件坐标来做到这一点……
如果您不希望按钮与DrawView
重叠, DrawView
使用LinearLayout
将所有View
分开。 目前,从XML布局判断(并假设没有什么时髦的布局编程代码事),你的按钮都重叠DrawView
。
我给您的印象是两个按钮并排放置在顶部,而DrawView
填充了下面的其余屏幕区域。 为此,请使用垂直方向的外部容器LinearLayout
。 它的第一个孩子是另一个水平放置的LinearLayout
,其中包含两个按钮。 内部LinearLayout
的第二个子级是DrawView
。 使用宽度,高度和重量属性获得所需的尺寸。 (或者,另一种方法是保留您拥有的XML布局结构,但是在DrawView
上设置一些顶部边距以等于按钮的高度,可以将其固定在XML布局中,或者以编程方式完成。)
编辑抱歉,我完全错过了layout_above
属性,该属性使我的第二句话无效。 在那种情况下,目前还不能启动Eclipse。 无论如何,请尝试使用LinearLayout
方法。
原来这是Android模拟器显示界面方式中的一个怪异错误。 它可能会在实际设备上做类似的事情(甚至在侦听器视图之外drawView
触摸事件),但是由于它将显示限制为drawView
,因此对于我的应用程序,我可以放心地忽略它们,因为我只需drawView
屏幕上提取绘制的形状即可。 drawView
。 不过,这可能会在其他应用程序中引起头痛。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.