Context: I'm developing an Android application for tablets (landscape) with image resources which has a resolution of 1920x1200. That resolution fits on the following screen sizes and densities:
drawable-xlarge-hdpi
drawable-large-xhdpi
Problem: If I include all my image resources duplicated on this two folders the final size of the APK will be unnecessarily heavy
My unsuccessful approach: I tried to use Alias for this drawables as defined here: http://developer.android.com/guide/topics/resources/providing-resources.html#AliasResources
I have my image resource in:
res/drawable-nodpi/image_cmn.png
and the two alias inside corresponding screen sizes and densities folders:
res/drawable-xlarge-hdpi/image.xml
res/drawable-large-xhdpi/image.xml
image.xml:
<?xml version="1.0" encoding="utf-8"?>
<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
android:src="@drawable/image_cmn" />
Of course, when I use my image inside a layout file I reference the alias:
<ImageView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:src="@drawable/image" />
But sadly Android is not resizing properly the resource for my testing tablet (mdpi) and the result is that I have bigger images.
I tried to move the original png's to res/drawable even to res/raw but result is the same than res/drawable-nodpi.
If I move this png's to res/drawable-xlarge-hdpi (same of xml alias) the result is correct but naturally that not solve my problem cause also I'd have to copy them to res/drawable-large-xhdpi and apk size increases.
Does anyone know how to achieve that?
The best way to create a responsive layout is to use ConstraintLayout as the base layout in your UI. ConstraintLayout enables you to specify the position and size of each view according to spatial relationships with other views in the layout. All the views can then move and resize together as the screen size changes.
The first pitfall you must avoid is using pixels to define distances or sizes. Defining dimensions with pixels is a problem because different screens have different pixel densities, so the same number of pixels may correspond to different physical sizes on different devices.
Classic drawable resources such as images are stored in the drawable folder. In contrast, vector drawables are stored in drawable-v24 . For this project, keep the drawable default and click OK. You should now see the New File dialog box.
I try to avoid using wrap_content on ImageViews due to different platform versions resizing the images differently, if you put an explicit width and height in dp it doesn't matter as much which image gets selected.
In your case I would have a single image in drawable/xhdpi. Specify it's width and height in the layout file in dp. For a 1920x1200px image that would be layout_width="960dp" layout_height="600dp"
The image will be the roughly the same physical size on x-large tablets as large tablets.
If you want the image to be bigger on x-large tablets, include a second layout file where the width and height of the images are increased but keep the same images.
Alternatively you can use dimension resources that are different between large and x-large.
I can propose two solutions for this problem:
First one:
ImageView
in code.Second one (it is ugly, but very quick):
Just compress your png images with tinypng.com. It can reduece your images up to 70-80% without losing quality (for mobile devices).
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With