可触摸列中的“空白”阻止了触摸事件

问题描述

我正在尝试在现有应用中使用Jetpack Compose。在完成将recommendations与现有应用程序集成之后,我在现有xml布局中使用了ComposeView

       <?xml version="1.0" encoding="utf-8"?>
       <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical">

            <org.rajawali3d.view.SurfaceView
                android:id="@+id/rajwaliSurface"
                android:layout_width="match_parent"
                android:layout_height="match_parent" />

            <androidx.compose.ui.platform.ComposeView
                android:id="@+id/my_composable"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignParentBottom="true" />
        </RelativeLayout>

我正在用SurfaceView渲染合成视图,该视图用于显示3D图形。

我正在使用与此类似的可组合函数:

@Composable
fun MyComposable() {
    Col() {
       Card(Modifier.width(100.dp){
         Text("Row1")
       }
       Card(Modifier.width(400.dp){
         Text("Row2")
       }
    }
}

问题是:如果Surface事件发生在Col列中的“空白”内,即Row2上方Row1上方,则不会捕获Surface事件中的触摸事件。值得一提的是,触摸Row2的右侧效果很好。似乎触摸事件不会通过ComposableView跨越的矩形传播,即使是“空”的部分也是如此。

解决方法

说明:由于视图小于表面,因此可以单击“列”的侧面。 col填充了“空”空间,因为col的大小满足其Composables的要求。因此,最宽的可合成内容为400dp(Row2),即现在的View宽度。

您可以自己转发/冒泡。 如果您需要准确的点击位置,则可以使用提供的Modifier.rawPressStartGestureFilter偏移量Documentation,或者可以找到更合适的选择。

class MyFragment : Fragment() {

    private lateinit var binding: ExampleBinding
    
    override fun onCreateView(inflater: LayoutInflater,container: ViewGroup?,savedInstanceState: Bundle?): View? {
        binding = ExampleBinding.inflate(inflater,container,false)
        return binding.root
    }

    override fun onViewCreated(view: View,savedInstanceState: Bundle?) {
        super.onViewCreated(view,savedInstanceState)
        binding.myComposable.setContent {
            MyComposable(bubbleClick = { handleClickForSurface() })
        }
        binding.rajwaliSurface.setOnClickListener { 
            handleClickForSurface()
        }
    }
    
    private fun handleClickForSurface() {
        // Handle the click
    }

    companion object {
        @Composable
        fun MyComposable(bubbleClick: () -> Unit) {
            Column(Modifier.clickable(onClick = bubbleClick)) {
                Card(Modifier.width(100.dp)) {
                    Text("Row1")
                }
                Card(Modifier.width(400.dp)) {
                    Text("Row2")
                }
            }
        }
    }
}

编辑:添加了说明

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...