For my app, I need to have same images with 2 or 3 different sizes
Or I wonder if it would be possible to take the drawables from another drawable-folder (ie: the same images with different resolutions are available like that)
Else, I should copy the same image several times in each drawable folder (mdpi, hdpi, xhdpi)
Ex: I have drawable ima in hdpi folder and I need the same images smaller and greater which are available in mdpi and xhdpi folder => How can i get them or do I have to copy the images I need in the hdpi folder ?
Excuse me for my bad english
Thanks for helping me
try like this programmatically..
InputStream is=this.getResources().getAssets().open("drawable.png");
is=this.getResources().openRawResource(R.raw.myDrawable);
or
If you want to use the path try the following :
private void showImage() {
String uri = "drawable/icon";
// int imageResource = R.drawable.icon;
int imageResource = getResources().getIdentifier(uri, null, getPackageName());
ImageView imageView = (ImageView) findViewById(R.id.myImageView);
Drawable image = getResources().getDrawable(imageResource);
imageView.setImageDrawable(image);
}
But it's recommended to use the R references :
int imageResource = R.drawable.icon;
Drawable image = getResources().getDrawable(imageResource);
Source
drawable-hdpi drawable-mdpi,drawable-ldpi are just different folders to make difference between images quality depending on the screen resolution. The idea is to put the same images in different folder with different resolutions ...
folders named mdpi, hdpi, xhdpi is for random devices , I mean there are for devices with random screens. There are 4 type of android devices considering from screen. small, normal , large , extralarge and that's why there are these folders , why you don't want to change your pictures names? If it's didn't help can you explain your question more recognizable? I don't sure I andertood question normally :)
Regards Hayk Nahapetyan
I'm not sure that I completely understand you but as for me you should logically organize your drawables and put them to assets folder not to resources. Then you can use them as you want.
Also I think there are no way to access resources from another screen.
Hope I understand you post right.
EDIT
API Level 15 introduced Resources.getDrawableForDensity() method. As far as I understood there is no way to launch it on older versions.
Related
I am directly adding images in drawable folders and it is coming fine with ImageView tag android:src="#drawable/image_name" but I wonder what to do with the other drawable folders as shown below.
Do I need to add same image in all drawable folders or my way of adding images in drawable folders is wrong?
Please help me!
The image is same, but the size should be different for each folders.
If you add the image only in drawable folder, same image will be loaded for all screen resolutions. So for eg: if the image size is small, this may result in bad image quality.
You can find a similar question here
I use Android studio plugin Android Drawable Importer
All these drawable folders represent different android phone densities. The best folder to put your images is drawable-xxhdpi as android automatically downscale or upscale the images depending on your devices density and most phones these days are on xxhdpi density.
If you put a image in drawable folder only there are chances that image may get distorted(as it upscales) in xxxhdpi density.
If you are putting images in xxhdpi ,make sure you create your images acc. to xxhdpi resolution.
If you don't feel the image is looking right in some phones than check the density of that phone and put an image in that specific density folder acc. to it's size(reduced or increased).
Just put it in the drawable folder, no need to put it in other drawable-... folders because those folders and contents inside are created automatically by android studio.
I found this link Why don't some xhdpi mobiles display image located in /res/drawable only? and according to the answer "you should not put images files in the drawable folder". Is it true? there is a link in that answer but does anyone have an official reference on this matter. I search for an answer but still did't find any. Please help me to understand the drawable folder.
"you should not put images files in the drawable folder". Is it true?
It is not true, as long as you remember the fact the drawable is a shortcut for drawable-mdpi, so your drawable as in fact been scaled density-wise.
Drawable folder is meant to hold images.
There are many drawable folder with customization, like
drawable-mdpi : devices which fall under medium density will take images from this folder.
drawable-mdpi-port : devices which fall under medium density and the orientation is portrait will take images from this folder.
Priority matters. Suppose the device is medium density and not in portrait mode, then it will take in drawable-mdpi.
The default folder is drawable, this folder will be in use under the following situations.
If the device doesn't fall under the specified customization.
If the item image is common for all density and resolutions.
I had a scenario where I have 2 images with same name but of different sizes in hdpi,mdpi folders like below:
drawable-hdpi/a.png
drawable-mdpi/a.png
I tried to access the images in my code as below:
ImageView iv = (ImageView)findViewById(R.id.img);
int drawableID = this.getResources().getIdentifier("a", "drawable", getPackageName());
iv.setImageResource(drawableID);
So, is there a way in which I can change settings in emulator so that I can create 2 different emulators so that it takes images from different folders, because as of now I am able to see only image from mdpi folder.
Can any one help me in sorting out this issue?
Try http://www.genymotion.com/
It's faster than common emulator, and you can easy create devices with different dpi.
Suppose I have an image, named "image.jpg" inside res/raw/ folder.
Then I load it with :
InputStream imageIS = this.getResources().openRawResource(R.raw.image);
Bitmap myImage = BitmapFactory.decodeStream(imageIS);
Looks like they're not scaled according to screen densities (ldpi/mdpi/hdpi/etc..).
How can I scale those images according to different screen densities ?
(I know that there is an easy way doing so, by placing it into drawable folder, but for some reasons, I'd like to place my image in raw folder)
By placing it in the raw folder, you've told Android you want the image exactly as it is. If you really want the system to scale your image according to size and density of the device, you have to place it in one of the drawable folders under res. If you just like to use the raw folder, then you apparently just like to keep your images as they are.
I have two drawable folders: drawable-mdpi and drawable-ldpi
I want to keep this structure (i.e. I don't' want to move my images to /assets), so that Android will automatically pick the appropriate artwork depending on the device density, however, on occasion I need to access the larger drawable version on the smaller device.
Is there a way to access the drawable-ldpi folder from code? I thought the following might be the answer, but it did not work:
Uri path = Uri.parse("android.resource://com.example.test/res/drawable-ldpi/icon");
imageview.setImageURI(path); //assume imageview is already initialized etc.
I get a java.io.FileNotFoundException (no such file or directory) warning (it doesn't crash, but it just doesn't load either).
Thanks so much for your help!
probably not much help but there is Resources.getDrawableForDensity() but this is for API 15 :-(
Generally, if you ever need to use the HDPI version, keep ONLY the HDPI version of the image, and the lower density phone will automatically use the HDPI drawable because it has no choice (i.e. a lower resolution image with that drawable name does not exist).
If you really need to switch between the hdpi and mdpi version I would suggest using a different filename and swapping programmatically, or showing/hiding XML elements if you prefer doing it that way... but that seems a little heavy-handed.
ImageView image = (ImageView)findViewById(R.id.imageView);
Bitmap bm = BitmapFactory.decodeResource(getResources(),R.drawable.abc);
image.setImageBitmap(bm);
Try reading THIS LINK also for more study over hdpi and mdpi concept