اگر شما برنامه نویس اندروید هستید، مطمئناً تفاوت دو فرمت png و svg رو در عکس ها می دونید وگرنه به شما توصیه میکنم قبل از خوندن این مقاله یه سری به گوگل بزنید و سرچ کنید شک نکنید به نتیجه خوبی می رسید D:
شاید برای خیلی از شما پیش اومده که دوست داشتید لیستی داینامیک که هرآیتم اون شامل یک آیکن عکس بوده رو از سمت سرور دریافت کنید اما نمی دونستید که چطور باید عکسهاتون که فرمت Svg دارند رو بصورت ریموت از سرور بگیرید و بعنوان آیکن ست کنید. در این مقاله سعی کردم راهکاری رو برای شما معرفی کنم که بتونه باری از دوشتون برداره و مجبور نباشید از این فرمت فقط بصورت هاردکد در کدهاتون استفاده کنید(که البته کار درستی هم نیست!!!)
برای شروع شما باید فایل androidSvg.jar رو از این لینک دانلود کنید.
https://bitbucket.org/paullebeau/androidsvg/downloads/androidsvg-1.2.1.jar
در مرحله بعد ، شما باید فایل .jar را درapp / libs / path اضافه کنید. اگر پوشه libs در پروژه شما وجود نداشت ، با کلیک راست بر روی پوشه app -> new -> Directory یک پوشه به نام libs بسازید . نکته مهم اینکه وقتی که فایل .jar را اضافه می کنید ، باید اون را به عنوان یک کتابخانه درج کنید. برای انجام این کار ، شما باید روی فایل .jar راست کلیک کرده و روی Add As Library کلیک کنید ...
در مرحله بعد ، باید پروژتون رو sync کنید.
بهتون تبریک میگم? ،شما AndroidSvg رو اضافه کردید!
برای فعال کردن Glide برای بارگذاری .svg از وب ، باید سه کلاس زیر را به پروژه اضافه کنید:
`/** * Convert the {@link SVG}'s internal representation to an Android-compatible one ({@link Picture}). */ public class SvgDrawableTranscoder implements ResourceTranscoder<SVG, PictureDrawable> { @Nullable @Override public Resource<PictureDrawable> transcode( @NonNull Resource<SVG> toTranscode, @NonNull Options options) { SVG svg = toTranscode.get(); Picture picture = svg.renderToPicture(); PictureDrawable drawable = new PictureDrawable(picture); return new SimpleResource<>(drawable); } }
/** Decodes an SVG internal representation from an {@link InputStream}. */ public class SvgDecoder implements ResourceDecoder<InputStream, SVG> { @Override public boolean handles(@NonNull InputStream source, @NonNull Options options) { // TODO: Can we tell? return true; } public Resource<SVG> decode( @NonNull InputStream source, int width, int height, @NonNull Options options) throws IOException { try { SVG svg = SVG.getFromInputStream(source); return new SimpleResource<>(svg); } catch (SVGParseException ex) { throw new IOException("Cannot load SVG from stream", ex); } } }
`/** * Listener which updates the {@link ImageView} to be software rendered, because {@link * com.caverock.androidsvg.SVG SVG}/{@link android.graphics.Picture Picture} can't render on a * hardware backed {@link android.graphics.Canvas Canvas}. */ public class SvgSoftwareLayerSetter implements RequestListener<PictureDrawable> { @Override public boolean Failed( GlideException e, Object model, Target<PictureDrawable> target, boolean isFirstResource) { ImageView view = ((ImageViewTarget<?>) target).getView(); view.setLayerType(ImageView.LAYER_TYPE_NONE, null); return false; } @Override public boolean onResourceReady( PictureDrawable resource, Object model, Target<PictureDrawable> target, DataSource dataSource, boolean isFirstResource) { ImageView view = ((ImageViewTarget<?>) target).getView(); view.setLayerType(ImageView.LAYER_TYPE_SOFTWARE, null); return false; } }
و جادو اینجاست:
`GenericRequestBuilder<Uri,InputStream,SVG,PictureDrawable> requestBuilder = Glide.with(context) .using(Glide.buildStreamModelLoader(Uri.class, context), 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.svg_image_view_placeholder) .error(R.drawable.error_image) .listener(new SvgSoftwareLayerSetter<Uri>()); Uri uri = Uri.parse(svgImageUrl); requestBuilder .diskCacheStrategy(DiskCacheStrategy.SOURCE) .load(uri) .into(imageView);