简体   繁体   中英

Android: Possible to use DP on a layout and make it look the same across devices?

I'll break my question in steps, so that it's easier to follow/answer.

Step 1: According to the Android Developer Guide , "The density-independent pixel is equivalent to one physical pixel on a 160 dpi screen". This means that on a Galaxy S, which has 233 dpi, 1 dp is equal to 1.46 physical pixels (233/160).

Step 2: Given the Galaxy S has a resolution of 480x800, it means that the height of its screen is 548dp (800 physical pixels divided by 1.46). So if I make the height of a LinearLayout I create to be 274dp it will take exactly half the screen. I tested, and it works.

Step 3: The Galaxy S3 has 306 dpi, so on that device 1dp = 1.9125 physical pixels (306/160). Since it has a resolution of 720x1280, the height of its screen is 670dp (1280/1.9125). Again, if I make a LinearLayout with around 335 it will take half the screen. Tested and worked.

Question : How do I make a LinearLayout that will take half the screen both on the Galaxy S and on the Galaxy S3 using Density-independent pixels? Cause if I use 274dp it will take half the screen only on the S, and vice-versa. Or are my calculations wrong in any step?

Update : Thinking about it I came up with the following idea: use "ScreenMetrics" to get both the dpi and screen resolution of the device. Then let my app calculate the total size of the screen in DPs (which will be the resolution divided by (dpi of device/160), and then set the height of the layout dynamically to be half of that. A lot of work, but I guess it's the way to do this?

Use a LinearLayout containing an empty View , then your real content, then another empty View . Set the empty views to android:layout_height="0dp" android:layout_weight="1" and your content to android:layout_height="0dp" android:layout_weight="2" . Now the enclosing LinearLayout will give your content half the height, in the centre of the screen, and the empty views the other half (split between them equally). If you instead want your content only in the top half (or bottom half) of the screen, instead of the centre, remove one of the empty views and use android:layout_weight="1" .

If you're trying to fit things relative to the screen, always use some construction like this. You should only use dp measurements for small, fixed sizes like margins or icon heights.

On galaxy S , the dp is 1.5

ldpi: 1dp = 0.75px
mdpi: 1dp = 1px
hdpi: 1dp = 1.5px
xdpi: 1dp = 2dp

the reall px will be `(int)(density * x + 0.5)

you can get you dp with

getResources().getDisplayMetrix().density.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM