Как принудительно изменить композицию изображения, не создавая каждый раз новое растровое изображение?

#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. Можете ли вы поделиться кодом чертежа или некоторыми его частями?