java - পিএনজি এবং এসভিজি উভয়ই লোড করার জন্য গ্লাইডের কী কোনও পদ্ধতি আছে?




android svg (2)

আমি আমার ImageView কিছু চিত্র লোড করতে Glide ব্যবহার করছি এবং আমি জানি যে এটি PNG বা JPG মতো চিত্রগুলি হ্যান্ডেল করতে পারে কারণ এটি SVG পরিচালনা করতে পারে।

কথাটি, যতদূর আমি জানি, আমি এই দুই ধরণের চিত্র লোড করার উপায়টি আলাদা। ভালো লেগেছে:

"সাধারণ" চিত্র লোড হচ্ছে

Glide.with(mContext)
                .load("URL")
                .into(cardHolder.iv_card);

এসভিজি লোড হচ্ছে

GenericRequestBuilder<Uri, InputStream, SVG, PictureDrawable> requestBuilder = Glide.with(mContext)
        .using(Glide.buildStreamModelLoader(Uri.class, mContext), InputStream.class)
        .from(Uri.class)
        .as(SVG.class)
        .transcode(new SvgDrawableTranscoder(), PictureDrawable.class)
        .sourceEncoder(new StreamEncoder())
        .cacheDecoder(new FileToStreamDecoder<>(new SVGDecoder()))
        .decoder(new SVGDecoder())
        .listener(new SvgSoftwareLayerSetter<Uri>());

requestBuilder
        .diskCacheStrategy(DiskCacheStrategy.NONE)
        .load(Uri.parse("URL"))
        .into(cardHolder.iv_card);

এবং যদি আমি প্রথম পদ্ধতিতে এসভিজি লোড করার চেষ্টা করি তবে এটি কাজ করবে না। আমি যদি দ্বিতীয় পদ্ধতিতে পিএনজি বা জেপিজি লোড করার চেষ্টা করি তবে এটি কোনওভাবেই কাজ করবে না।

উভয় চিত্র গ্লাইড ব্যবহার করে লোড করার জন্য কি সাধারণ উপায় আছে?

আমি যে সার্ভার থেকে এই চিত্রগুলি আনছি সেগুলি ডাউনলোড করার আগে আমাকে চিত্রের ধরণটি বলবেন না। এটি একটি REST সার্ভার এবং উত্সটি "http://foo.bar/resource" মতো পুনরুদ্ধার করা হবে। চিত্রের ধরণটি জানার একমাত্র উপায় হ'ল প্রতিক্রিয়া পড়া।


আপনার লক্ষ্য অর্জনের জন্য আপনি একসাথে Glide এবং AndroidSVG ব্যবহার করতে পারেন।

এসভিজির জন্য গ্লাইডের নমুনা রয়েছে। নমুনা উদাহরণ

অনুরোধবিল্ডার সেটআপ করুন

requestBuilder = Glide.with(mActivity)
    .using(Glide.buildStreamModelLoader(Uri.class, mActivity), InputStream.class)
    .from(Uri.class)
    .as(SVG.class)
    .transcode(new SvgDrawableTranscoder(), PictureDrawable.class)
    .sourceEncoder(new StreamEncoder())
    .cacheDecoder(new FileToStreamDecoder<SVG>(new SvgDecoder()))
    .decoder(new SvgDecoder())
    .placeholder(R.drawable.ic_facebook)
    .error(R.drawable.ic_web)
    .animate(android.R.anim.fade_in)
    .listener(new SvgSoftwareLayerSetter<Uri>());

ইউরি সহ রিকোয়েস্টবিল্ডার ব্যবহার করুন

Uri uri = Uri.parse("http://upload.wikimedia.org/wikipedia/commons/e/e8/Svg_example3.svg");
requestBuilder
    .diskCacheStrategy(DiskCacheStrategy.SOURCE)
    // SVG cannot be serialized so it's not worth to cache it
    .load(uri)
    .into(mImageView);

এইভাবে আপনি আপনার লক্ষ্য অর্জন করতে পারেন। আমি আশা করি এই সহায়ক।


আমি একটি চিত্র বা এসভিজি ডিকোড করতে নমনীয় ডিকোডিং পাইপলাইন যুক্ত করেছি, সম্ভবত সহায়তা করতে পারে! গ্লাইড এসভিজি উদাহরণের উপর ভিত্তি করে

সঙ্কেতমোচক

class SvgOrImageDecoder : ResourceDecoder<InputStream, SvgOrImageDecodedResource> {

override fun handles(source: InputStream, options: Options): Boolean {
    return true
}

@Throws(IOException::class)
override fun decode(
    source: InputStream, width: Int, height: Int,
    options: Options
): Resource<SvgOrImageDecodedResource>? {
    val array = source.readBytes()
    val svgInputStream = ByteArrayInputStream(array.clone())
    val pngInputStream = ByteArrayInputStream(array.clone())

    return try {
        val svg = SVG.getFromInputStream(svgInputStream)

        try {
            source.close()
            pngInputStream.close()
        } catch (e: IOException) {}

        SimpleResource(SvgOrImageDecodedResource(svg))
    } catch (ex: SVGParseException) {
        try {
            val bitmap = BitmapFactory.decodeStream(pngInputStream)
            SimpleResource(SvgOrImageDecodedResource(bitmap = bitmap))
        } catch (exception: Exception){
            try {
                source.close()
                pngInputStream.close()
            } catch (e: IOException) {}
            throw IOException("Cannot load SVG or Image from stream", ex)
        }
    }
}

ট্রান্সকোডার

class SvgOrImageDrawableTranscoder : ResourceTranscoder<SvgOrImageDecodedResource, PictureDrawable> {
override fun transcode(
    toTranscode: Resource<SvgOrImageDecodedResource>,
    options: Options
): Resource<PictureDrawable>? {
    val data = toTranscode.get()

    if (data.svg != null) {
        val picture = data.svg.renderToPicture()
        val drawable = PictureDrawable(picture)
        return SimpleResource(drawable)
    } else if (data.bitmap != null)
        return SimpleResource(PictureDrawable(renderToPicture(data.bitmap)))
    else return null
}

private fun renderToPicture(bitmap: Bitmap): Picture{
    val picture = Picture()
    val canvas = picture.beginRecording(bitmap.width, bitmap.height)
    canvas.drawBitmap(bitmap, null, RectF(0f, 0f, bitmap.width.toFloat(), bitmap.height.toFloat()), null)
    picture.endRecording();

    return picture
}

ডিকোডেড রিসোর্স

data class SvgOrImageDecodedResource(
val svg:SVG? = null,
val bitmap: Bitmap? = null)

গ্লাইড মডিউল

class AppGlideModule : AppGlideModule() {
override fun registerComponents(
    context: Context, glide: Glide, registry: Registry
) {
    registry.register(SvgOrImageDecodedResource::class.java, PictureDrawable::class.java, SvgOrImageDrawableTranscoder())
        .append(InputStream::class.java, SvgOrImageDecodedResource::class.java, SvgOrImageDecoder())
}

// Disable manifest parsing to avoid adding similar modules twice.
override fun isManifestParsingEnabled(): Boolean {
    return false
}

}