Vous pouvez mélanger ou superposer des images sources pour afficher des images superposées sur un canevas. Par exemple, vous pouvez reproduire la façon dont le framework Android génère des icônes d'application en combinant des drawables d'arrière-plan et de premier plan distincts. Pour afficher des images superposées, procédez comme suit:
- Empilez des images sur un canevas.
- Superposez la source.
Compatibilité des versions
Cette implémentation nécessite que la version minimale du SDK de votre projet soit définie sur le niveau d'API 21 ou supérieur.
Dépendances
Empilez des images sur un canevas
Le code suivant superpose deux images sources, ce qui génère une image mélangée sur le canevas:
class OverlayImagePainter constructor( private val image: ImageBitmap, private val imageOverlay: ImageBitmap, private val srcOffset: IntOffset = IntOffset.Zero, private val srcSize: IntSize = IntSize(image.width, image.height), private val overlaySize: IntSize = IntSize(imageOverlay.width, imageOverlay.height) ) : Painter() { private val size: IntSize = validateSize(srcOffset, srcSize) override fun DrawScope.onDraw() { // draw the first image without any blend mode drawImage( image, srcOffset, srcSize, dstSize = IntSize( this@onDraw.size.width.roundToInt(), this@onDraw.size.height.roundToInt() ) ) // draw the second image with an Overlay blend mode to blend the two together drawImage( imageOverlay, srcOffset, overlaySize, dstSize = IntSize( this@onDraw.size.width.roundToInt(), this@onDraw.size.height.roundToInt() ), blendMode = BlendMode.Overlay ) } /** * Return the dimension of the underlying [ImageBitmap] as it's intrinsic width and height */ override val intrinsicSize: Size get() = size.toSize() private fun validateSize(srcOffset: IntOffset, srcSize: IntSize): IntSize { require( srcOffset.x >= 0 && srcOffset.y >= 0 && srcSize.width >= 0 && srcSize.height >= 0 && srcSize.width <= image.width && srcSize.height <= image.height ) return srcSize } }
Points clés concernant le code
- Utilise
OverlayImagePainter
, qui est une implémentation personnalisée dePainter
que vous pouvez utiliser pour superposer des images à l'image source. Le mode de fusion contrôle la façon dont les images sont combinées. La première image ne remplace rien d'autre. Aucun mode de fusion n'est donc nécessaire. Le mode de fusionOverlay
de la deuxième image écrase les zones de la première image qui sont recouvertes par la deuxième image. DrawScope.onDraw()
est ignoré et les deux images sont superposées dans cette fonction.intrinsicSize
est remplacé pour indiquer correctement la taille intrinsèque de l'image combinée.
Superposer l'image source
Avec ce peintre personnalisé Painter
, vous pouvez superposer une image sur l'image source comme suit:
val rainbowImage = ImageBitmap.imageResource(id = R.drawable.rainbow) val dogImage = ImageBitmap.imageResource(id = R.drawable.dog) val customPainter = remember { OverlayImagePainter(dogImage, rainbowImage) } Image( painter = customPainter, contentDescription = stringResource(id = R.string.dog_content_description), contentScale = ContentScale.Crop, modifier = Modifier.wrapContentSize() )
Points clés concernant le code
- Les images à combiner sont chacune chargées en tant qu'instances
ImageBitmap
avant d'être combinées à l'aide deOverlayImagePainter
. - Les images combinées sont affichées par un composable
Image
qui utilise le peintre personnalisé pour combiner les images sources lors du rendu.
Résultats
![Painter personnalisé superposant une image au-dessus d'une autre](https://developer.android.google.cn/static/develop/ui/compose/images/graphics-rainbowoverlay.jpg?hl=fr)
Image
qui utilise un Painter
personnalisé pour superposer une image arc-en-ciel semi-transparente à l'image d'un chien.Collections contenant ce guide
Ce guide fait partie de ces collections de guides rapides sélectionnées qui couvrent des objectifs de développement Android plus larges:
![](https://developer.android.google.cn/static/images/quick-guides/collection-illustration.png?hl=fr)