我正在开发一款应用程序,我想在拖动元素时使用自定义可组合项作为拖动装饰。
默认情况下,jetpack compose 使用拖动元素本身作为拖动装饰,但我想使用不同的可组合项。
如果我什么都不做,Compose 将自动使用源元素作为拖动装饰,如下例所示:
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
enableEdgeToEdge()
setContent {
Scaffold(modifier = Modifier.fillMaxSize()) { innerPadding ->
App(
modifier = Modifier
.padding(innerPadding)
.fillMaxSize()
)
}
}
}
}
@Composable
fun DragSource(modifier: Modifier = Modifier) {
Box(
modifier = modifier
.background(color = Color.Yellow)
.size(100.dp),
contentAlignment = Alignment.Center
) {
Text(text = "Drag Me")
}
}
@OptIn(ExperimentalFoundationApi::class)
@Composable
fun App(modifier: Modifier = Modifier) {
Box(
modifier = modifier,
contentAlignment = Alignment.Center
) {
DragSource(
modifier = Modifier.dragAndDropSource {
detectTapGestures(
onLongPress = {
startTransfer(
DragAndDropTransferData(
ClipData.newPlainText("image uri", "image uri")
)
)
}
)
}
)
}
}
现在,我不再使用源元素作为拖动装饰,而是想使用像这样的自定义可组合项:
@Composable
fun DraggedShape(modifier: Modifier = Modifier) {
Box(
modifier = modifier
.size(100.dp)
.background(color = Color.Red, shape = RoundedCornerShape(16.dp))
)
}
我怎样才能实现这个目标?
我知道dragAndDropSource
提供了一个drawDragDecoration
参数,您可以在其中使用画布 API 绘制自定义装饰,如下例所示,我绘制了一个蓝色矩形:
DragSource(
modifier = Modifier.dragAndDropSource(
drawDragDecoration = { // draw scope
drawRect(color = Color.Blue)
}
) {
//...
}
)
但是,这只允许用画布绘图,并且我需要使用可组合作为拖动装饰,而不仅仅是可以用画布 API 拖动的形状。
我有一个想法,就是以某种方式将可组合项转换为位图,然后drawDragDecoration
使用画布 API 在 lambda 中绘制它(我不知道这在 compose 中是否可行)。有没有更好的方法可以做到这一点?任何解决方法或建议都将不胜感激!
提前致谢。
正如您所建议的,您可以通过使用将该组合转换为 ImageBitmap 来实现,最简单的方法是使用 RememberGraphicsLayer 来获取 GraphicsLayer 和
记录可组合绘图并将其转换为 ImageBitmap
结果
完整代码