I also agree with other people who have posted the link to Supporting Multiple Screens on the Android Developer website, as it is a great resource to get to understanding the difference between the classes (small, normal, large) of screens and the different screen densities (ldpi, mdip, hdpi).
There is also a very interesting article on Metrics and Grids which has helped me out a lot.
You should also keep the scale of pixels to dip in the back of your head:
ldpi: 1dp = 0.75px
, mdpi: 1dp = 1px
, hdpi: 1dp = 1.5px
and xhdpi: 1dp = 2px
I personally like to associate ldpi with a resolution of about 240x320, mdpi with 320x480, hdpi with 480x800 and xhdpi with anything larger, such as the SGS3.
The link to Metrics and Grids, for example, states that a button should be at least 48dp.
This means that if you want to create a button with the size of 48x48
, which translates to 48x48 px for mdpi
, you also have to supply a graphic of 96x96 px for xhdpi
, 72x72 px for hdpi
and 36x36 px for ldpi
.
I also suggest you and your designer take a look at 9-patch images and try to tweak your UI to this. This will make your life as a developer a lot less troublesome.
The reason for this is that you can create small-sized images which can scale very nice throughout your app.
It's pretty obvious, you should try to create your graphics on the highest possible resolution (xhdpi for example) and then downscale to hdpi, mdpi and ldpi.
Another tip I came across, which I don't have the source to anymore, is to use the resource folder in Android, as it will be much better for performance, compared to only supplying a large image, and let the OS downscale it on the go. (But this SO post has some valid arguments in the answers)