我正在尝试在现有应用中使用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跨越的矩形传播,即使是“空”的部分也是如此。
答案 0 :(得分:0)
说明:由于视图小于表面,因此可以单击“列”的侧面。 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")
}
}
}
}
}
编辑:添加了说明