Możesz mieszać lub nakładać obrazy źródłowe, aby wyświetlać obrazy nałożone na płótnie. Możesz na przykład odtworzyć sposób generowania ikon aplikacji przez Android Framework, łącząc oddzielne elementy rysowane na tle i na pierwszym planie. Aby wyświetlić obrazy warstwowe:
- nakładać obrazy na obszar roboczy.
- nakładać źródło.
Zgodność wersji
Ta implementacja wymaga, aby minimalna wersja pakietu SDK projektu była ustawiona na poziom API 21 lub wyższy.
Zależności
Umieszczanie obrazów na warstwach
Ten kod nakłada 2 obrazy źródłowe na siebie, tworząc na płótnie obraz łączony:
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 } }
Najważniejsze informacje o kodzie
- Używa elementu
OverlayImagePainter
, który jest niestandardową implementacją elementuPainter
. Możesz go użyć do nakładania obrazów na obraz źródłowy. Tryb mieszania określa sposób łączenia obrazów. Pierwsze zdjęcie nie zastępuje niczego innego, więc nie trzeba stosować żadnego trybu mieszania. TrybOverlay
drugiego obrazu zastępuje obszary pierwszego obrazu, które są pokryte przez drugi obraz. DrawScope.onDraw()
jest zastąpiony, a w ramach tej funkcji oba obrazy są nakładane.intrinsicSize
jest zastąpiony, aby prawidłowo raportować rozmiar rzeczywisty połączonego obrazu.
Nakładanie obrazu źródłowego
Za pomocą tego narzędzia do ręcznej edycji Painter
możesz nałożyć obraz na obraz źródłowy w ten sposób:
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() )
Najważniejsze informacje o kodzie
- Obrazy, które mają zostać połączone, są wczytywane jako instancje
ImageBitmap
, zanim zostaną połączone za pomocą funkcjiOverlayImagePainter
. - Połączone obrazy są renderowane przez komponent
Image
, który podczas renderowania używa niestandardowego malarza do łączenia obrazów źródłowych.
Wyniki
![Malowanie niestandardowe z nałożeniem 2 obrazów na siebie](https://developer.android.google.cn/static/develop/ui/compose/images/graphics-rainbowoverlay.jpg?hl=pl)
Image
, który używa niestandardowego Painter
, aby nałożyć półprzezroczysty obraz tęczy na obrazie psa.Kolekcje zawierające ten przewodnik
Ten przewodnik należy do tych kolekcji krótkich przewodników, które obejmują szersze zagadnienia związane z tworzeniem aplikacji na Androida:
![](https://developer.android.google.cn/static/images/quick-guides/collection-illustration.png?hl=pl)