调度触摸事件到画布上绘制的视图

Posted

技术标签:

【中文标题】调度触摸事件到画布上绘制的视图【英文标题】:Dispatch touch event to view drawn on canvas 【发布时间】:2020-05-11 13:28:06 【问题描述】:

我正在制作一个自定义视图,我可以在其上添加项目(图像、文本等)并拖动它们,以及缩放和旋转。现在我想向该画布添加整个视图。我使用了Viewdraw(canvas) 方法,它可以工作。但是,我无法与该视图交互,例如例如,如果它有一个按钮,即使我将触摸事件传递给该视图,我也无法单击它。我正在这样做:

val mySubView = LayoutInflater.from(context).inflate(R.layout.item, null)

// mySubView is passed to CustomView at some point
class CustomView(context: Context, attrs: AttributeSet?) : View(context, attrs) 
    override fun onDraw(canvas: Canvas) 
        super.onDraw(canvas)
        mySubView.draw(canvas)
    

    override fun onTouchEvent(event: MotionEvent): Boolean 
        val handled = mySubView.onTouchEvent(event)
        return handled || super.onTouchEvent(event)
    

有什么想法吗?谢谢!

【问题讨论】:

【参考方案1】:

您将无法与您在画布上绘制的视图进行交互。您没有将其添加到布局“android 样式”中,而是手动绘制 - 这意味着您需要手动确定用户是否根据点击位置和按钮绘制位置点击绘制的按钮,手动调用选择器(您还需要手动重绘选择器用法)并手动调用相应的方法。这不是在 android 上做这些事情的好方法,因为你会错过几乎所有的 android ui 框架功能,你必须手动实现它们。

问题是您正在绘制视图的图片,而不是视图本身 - 这就是问题所在。

【讨论】:

好的。有视图更新怎么样?假设视图包含一个圆形进度条,是否可以在视图重绘时收到通知,以便我可以在画布上绘制它? 真的不知道。我从未尝试过这样的事情,但我可能会认为不会 - 因为进度条只是一个带有动画的图像文件。

以上是关于调度触摸事件到画布上绘制的视图的主要内容,如果未能解决你的问题,请参考以下文章

在 Android 中的多个视图上同时处理触摸事件

无法在 Android 设备上的 Javascript 中获取触摸事件的坐标

跨多个子视图处理触摸事件

仅将触摸事件转发到被触摸的视图

安卓权威编程指南-笔记 (第29章定制视图与触摸事件)

如何将触摸事件从一个视图传递到另一个视图