Supporting VectorDrawable on pre-lollipop devices without generating png images.
Recently the android support library 23.2 was released, and one of the best thing about this release is that Vector images are now backward compatible up to API level 7.
So what does this mean to us as a developer?
1. No generation of png images at build time: Android Studio 1.4 handled backward compatibility by generating png images at build time. This is no longer required, so we must expect a reduction in build time.
2. Smaller size of apk : There is no need to generate different size images for mdpi, hdpi, xhdpi, etc. One vector file is enough to support multiple screen size devices. This will reduce the size of the apk.
In this post, we'll see how we can use vector images that support pre-lollipop devices.
Using VectorDrawables in your project
The first step we need to do is to prevent android studio from generating png files for our vector images at build time. We do that by adding the following code to the defaultConfig section of the app level gradle file
vectorDrawables.useSupportLibrary = true
It is recommended to use gradle 2.0+ for this.
Now to use a vector drawable we just need to use the app:srcCompat
attribute as follows:
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:srcCompat="@drawable/ic_add" />
We can also set the image at runtime as follows:
imageView.setImageDrawable(ContextCompat.getDrawable(getContext(), R.drawable.ic_add));
Converting Vector Images to Bitmaps
There may be certain cases where you'll need to convert a vector image into a bitmap, for example, while creating a notification you'll need a bitmap for setting the LargeIcon of the notification. For this we can create the following function in our Utils.java file as follows,
public static Bitmap getBitmapFromVectorDrawable(Context context, int drawable) {
Drawable drawable = ContextCompat.getDrawable(context, drawableId);
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
drawable = (DrawableCompat.wrap(drawable)).mutate();
}
Bitmap bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(),
drawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
drawable.draw(canvas);
return bitmap;
}
Hope you find this post useful. If you have any queries, feel free to connect with me at https://twitter.com/askShantanu