#android #kotlin #canvas #bitmap #android-jetpack-compose
Вопрос:
Ясно, что в Android Compose, если состояние переменной/ввода составного файла изменяется, составное содержимое перекомпонируется.
С помощью:
val object = remember{ mutableStateOf(Object) }
возможно сохранить(запомнить) экземпляр объекта при каждой повторной компоновке, если изменяемое состояние не будет переназначено другому объекту, что фактически вызовет повторную компоновку составных элементов, которые используют этот объект в качестве аргумента.
Теперь давайте предположим:
val bitmap = remember { ImageBitmap() } val canvas = remember { Canvas(bitmap) } --- //composable Image(bitmap, contentDescription = "..")
в этом случае изображение загружается только один раз, даже после редактирования растрового изображения составляемое изображение никогда не будет перекомпозироваться, и результат никогда не будет отображаться на экране.
Кто-то сказал бы использовать переменную MutableState:
val bitmap = remember { mutableStateOf(ImageBitmap()) }
но изменяемое состояние не выдает, если ссылка на растровое изображение объекта одинакова.
Каков был бы наилучший способ контролировать частоту кадров, с которой растровое изображение отображается в компонуемом виде, не создавая каждый раз новое растровое изображение?
Итак, я нашел временное решение, хотя и чувствую, что оно не очень эффективно.
Пример кода:
val bitmap = remember { ImageBitmap(500, 500, hasAlpha = true, config = ImageBitmapConfig.Argb8888) } val canvas = remember { Canvas(bitmap)} var frames by remember { mutableStateOf(0) } var isDrawing by remember { mutableStateOf(false) } LaunchedEffect(isDrawing){ while (isDrawing){ frames delay(16) } } Box(modifier = Modifier.pointerInteropFilter() { e -gt; if (e.actionMasked == MotionEvent.ACTION_DOWN) { isDrawing = true } if (e.actionMasked == MotionEvent.ACTION_MOVE) { path = logic to get path canvas.drawPath(path, paint) } if (e.actionMasked == MotionEvent.ACTION_UP) { isDrawing = false } }){ Canvas() { frames.let { drawImage(bitTmp) } } }
Комментарии:
1. Как вы обновляете растровое изображение? Если не растровое изображение, должно быть что-то, что меняется. Вы можете использовать это как состояние.
2. при рисовании на холсте ссылка на растровое изображение всегда одна и та же
3. Можете ли вы поделиться кодом чертежа или некоторыми его частями?