लिखें में, Painter
ऑब्जेक्ट का इस्तेमाल, बनाई जा सकने वाली किसी चीज़ को दिखाने के लिए किया जाता है
(Android में तय किए गए Drawable
एपीआई की जगह) और असर
इसका इस्तेमाल करने वाले कंपोज़ेबल का मेज़रमेंट और लेआउट . ऐप्लिकेशन
BitmapPainter
एक ImageBitmap
लेता है, जो स्क्रीन पर Bitmap
बना सकता है.
ज़्यादातर मामलों में, ऊपर दिए गए painterResource()
का इस्तेमाल करने से, जवाब के तौर पर सही नतीजे मिलते हैं
ऐसेट के लिए पेंटर (जैसे, BitmapPainter
या VectorPainter
). ज़्यादा के लिए
दोनों के बीच अंतर के बारे में जानकारी - ImageBitmap बनाम Image पक्ष सेक्शन पढ़ें.
Painter
, DrawModifier
से अलग होता है, जो पूरी तरह से
ऐसी सीमाएं जो इसे दी जाती हैं और जिनके मेज़रमेंट या लेआउट पर कोई असर नहीं होता
कंपोज़ेबल.
अपनी पसंद के मुताबिक पेंटर बनाने के लिए, Painter
क्लास को बढ़ाएं और
onDraw
तरीका, जो कस्टम ड्रॉ करने के लिए DrawScope
को ऐक्सेस करता है
ग्राफ़िक्स. आप intrinsicSize
को ओवरराइड भी कर सकते हैं, जिसका इस्तेमाल इन कामों के लिए किया जाएगा
कंपोज़ेबल को इस तरह से प्रभावित करना कि उसमें यह शामिल हो:
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 } }
अब हमारे पास अपना कस्टम Painter
है, तो हम किसी भी इमेज को अपने ऊपर
सोर्स इमेज के बारे में यहां बताया गया है:
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() )
पसंद के मुताबिक बनाए गए पेंटर के साथ दो इमेज को जोड़ने का नतीजा नीचे देखा जा सकता है:
![पसंद के मुताबिक पेंटर, जो दो इमेज को एक-दूसरे के ऊपर ओवरले करता है](https://developer.android.com/static/develop/ui/compose/images/graphics-rainbowoverlay.jpg?authuser=8&hl=hi)
Modifier.paint(customPainter)
के साथ, पसंद के मुताबिक पेंटर भी इस्तेमाल किया जा सकता है
कंपोज़ेबल में कॉन्टेंट बनाने के लिए:
val rainbowImage = ImageBitmap.imageResource(id = R.drawable.rainbow) val dogImage = ImageBitmap.imageResource(id = R.drawable.dog) val customPainter = remember { OverlayImagePainter(dogImage, rainbowImage) } Box( modifier = Modifier.background(color = Color.Gray) .padding(30.dp) .background(color = Color.Yellow) .paint(customPainter) ) { /** intentionally empty **/ }
आपके लिए सुझाव
- ध्यान दें: JavaScript बंद होने पर लिंक टेक्स्ट दिखता है
- ImageBitmap बनाम Image पक्ष {:#bitmap-vs-vector}
- कंपोज़ में ग्राफ़िक्स
- इमेज लोड हो रही हैं {:#loading-images}