2021年9月5日日曜日

Jeptack Compose : DrawScope に描画したものを Bitmap にする。Bitmap を DrawScope に描画する。

ImageBitmap から Bitmap への変換には ImageBitmap.asAndroidBitmap() を使います。
Bitmap から ImageBitmap への変換には Bitmap.asImageBitmap() を使います。

  1. @Preview  
  2. @Composable  
  3. fun SampleScreen() {  
  4.     val density = LocalDensity.current  
  5.     val layoutDirection = LocalLayoutDirection.current  
  6.   
  7.     val bitmap = remember { mutableStateOf<Bitmap?>(null) }  
  8.   
  9.     Column {  
  10.         Button(  
  11.             onClick = {  
  12.                 bitmap.value = createBitmap(density, layoutDirection)  
  13.             },  
  14.             modifier = Modifier.padding(16.dp)  
  15.         ) {  
  16.             Text(text = "click")  
  17.         }  
  18.   
  19.         AndroidView(  
  20.             factory = { context ->  
  21.                 ImageView(context)  
  22.             },  
  23.             update = { imageView ->  
  24.                 imageView.setImageBitmap(bitmap.value)  
  25.             },  
  26.             modifier = Modifier.padding(16.dp)  
  27.         )  
  28.   
  29.         androidx.compose.foundation.Canvas(  
  30.             modifier = Modifier.padding(16.dp)  
  31.                 .size(with(LocalDensity.current) { 512.toDp() })  
  32.         ) {  
  33.             val bmp = bitmap.value  
  34.             if (bmp != null) {  
  35.                 drawImage(bmp.asImageBitmap())  
  36.   
  37.                 drawCircle(Color.White, radius = size.minDimension / 4f)  
  38.             }  
  39.         }  
  40.     }  
  41. }  
  42.   
  43. private fun createBitmap(  
  44.     density: Density,  
  45.     layoutDirection: LayoutDirection  
  46. ): Bitmap {  
  47.     val targetSize = 512  
  48.   
  49.     val imageBitmap = ImageBitmap(targetSize, targetSize)  
  50.     val size = Size(targetSize.toFloat(), targetSize.toFloat())  
  51.   
  52.     CanvasDrawScope().draw(density, layoutDirection, Canvas(imageBitmap), size) {  
  53.         drawCircle(Color.Red)  
  54.     }  
  55.   
  56.     return imageBitmap.asAndroidBitmap()  
  57. }