android - Jetpack Compose 中连续运动的动画
问题描述
我试图让一个框或图像对象能够使用从控制台/命令行或外部应用程序接收到的 X 和 Y 坐标在屏幕上平移。有没有办法调整 Modifier PointerInput() 以接受连续的 X 和 Y 输入而不是检测拖动手势?我正在使用 Jetpack Compose API。
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
val animationState = remember{ mutableStateOf(false)}
var offsetX by remember { mutableStateOf(0.dp) }
var offsetY by remember { mutableStateOf(0.dp) }
val imageSize = 200.dp
// Receive X,Y inputs from some device or continously read from command line inputs
do{
offsetX = 0.dp
offsetY = 5000.dp
} while(animationState.value)
BoxWithConstraints(
modifier = Modifier
.fillMaxSize()
.background(color = Color.White)
) {
someImage(
flashyMovement = animationState.value,
maxWidth = maxWidth,
maxHeight = maxHeight,
offsetX = offsetX,
offsetY = offsetY
)
}
}
@Composable
fun someImage(
maxWidth: Dp,
maxHeight: Dp,
offsetX: Dp,
offsetY: Dp) {
val resource: Painter
val modifier: Modifier
val imageSize = 200.dp
val xPositionState = infiniteTransition.animateFloat(
initialValue = 0f,
targetValue = 1f,
animationSpec = infiniteRepeatable(
animation = tween(
durationMillis = 20000,
easing = LinearEasing
)
)
)
modifier = Modifier.offset(
x = offsetX,
y = offsetY
)
}
Image(
modifier = modifier.width(imageSize).height(imageSize),
painter = resource,
contentDescription = "some Image",
)}
Box() {
var offsetX by remember { mutableStateOf(0f) }
var offsetY by remember { mutableStateOf(0f) }
Box(
Modifier
.offset { IntOffset(offsetX.roundToInt(), offsetY.roundToInt()) }
.background(Color.Blue)
.size(150.dp)
//.border(BorderStroke(2.dp, SolidColor(Color.Red)))
.pointerInput(Unit) {
detectDragGestures { change, dragAmount ->
change.consumeAllChanges()
//offsetX += dragAmount.x
offsetX = 150.dp.toFloat()
offsetY += dragAmount.y
}
}
)
解决方案
var OffsetX = remember { Animatable(0f) }
var OffsetY = //same as abov
内部Modifier.offset { IntOffset(OffsetX.value, OffsetY.value) }
.pointerInput(Unit)
coroutineScope.launch{
while(true)
pointerID = awaitPointerEvent{ awaitFirstDown().id }
drag(pointerID){change ->
offsetX.snapTo(offsetX.value + change.positionChange().x)
//Similarly for Y
}
}
}
}```
推荐阅读
- selenium-webdriver - 附加在范围报告中的屏幕截图未显示在 Bamboo 工件中,尽管它在本地工作正常
- arangodb - 是否可以在 arangodb 中事先不知道确切结构的情况下对所有属性进行索引?
- r - 当 annotate() 层的标签有下标时,ggsave() 不起作用
- typescript - 在 Typescript 中推断深度嵌套对象的类型
- reactjs - 在用户界面上更新更改的值
- python - 根据更改的输入值创建输出文件
- whitelist - modsecurity:在实施白名单规则时,是否真的需要关闭规则引擎?
- matlab - 如果值低于预定义阈值,则删除矩阵行
- python - 如何将 mlflow 与 tensorflow 对象检测 api 集成
- elasticsearch - Elasticsearch 在 grafana 上按问题分组