Android中的dp,px以及wrap_content的实际展示效果
因为一个效果中的图片设置了wrap_content的属性,但在720dp跟540dp上面显示不一致使老大非常恼火。跟他讲也讲不明白。于是乎让我们彼此测试来探个究竟。首先测试的是个图片:
它的物理像素是256*256的。
首先是个简单的测试布局,一个textview显示测试结果,一个imageview用来展示这张图片。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 |
<?xml version= "1.0"
encoding= "utf-8" ?> <LinearLayout xmlns:android= "http://schemas.android.com/apk/res/android" android:layout_width= "match_parent" android:layout_height= "match_parent" android:orientation= "vertical"
> <TextView android:id= "@+id/test" android:layout_width= "wrap_content" android:layout_height= "wrap_content" android:layout_gravity= "top|center_horizontal" android:textColor= "#009933" android:textSize= "20sp"
/> <ImageView android:id= "@+id/test_iv" android:layout_width= "wrap_content" android:layout_height= "wrap_content" android:layout_gravity= "top|center_horizontal" android:background= "@drawable/origami_colored_pencil_02"
/> </LinearLayout> |
首次测试时的宽高属性均为wrap_content,测试结果如下:
可以看到,测试手机为nexus 5,屏幕密度为3.0,屏幕dp分辨率为360*592。图片的物理分辨率为256*256,而显示后的宽高为768*768,可见是物理分辨率乘以密度的结果。
而将布局文件中的宽高属性都设为256dp之后,测试结果如下图:
是的,你没有看错,跟属性均为wrap_content时的测试结果是一致的。由此可以看出,在将imageview的宽高设置为wrap_content时,系统实际上是将背景图片的实际物理分辨率以dp单位的形式来展现出来的。而显示的图片转化成bitmap之后获取的width跟height实际上是在手机设备屏幕的物理分辨率。这点有点意思~
然后更有意思的在下面:
接着将imageview的宽高属性都设置为fill_parent,此时的测试结果如下:
在将imageview的属性宽设为fill_parent,高设为wrap_content后,测试结果如下:
想到这种结果没有?对的,是获取的bitmap大小依然为768*768!!!可见系统虽然将图片的显示变了样子但其大小依然没有发生变化,是其物理属性的大小乘以屏幕密度所的大小!
虽然亲眼看到出现这样的情况,但本人其实并不太明白这其中究竟是怎么回事,希望看到这篇博客的同行,了解其中原理的,能给个使人信服的解释。
祝好!
Ps:本人手机是LG Nexus 5,系统4.4.2,网站上介绍其屏幕物理分辨率为1920*1080,但实际上只有1776*1080,唉,最讨厌前台销售人员了,尽是忽悠~
下面是两个测试文件:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 |
package
com.peter.androidoverridedtest; import
com.peter.androidoverridedtest.util.DensityManager; import
android.app.Activity; import
android.graphics.Bitmap; import
android.graphics.BitmapFactory; import
android.graphics.drawable.BitmapDrawable; import
android.os.Bundle; import
android.util.DisplayMetrics; import
android.widget.ImageView; import
android.widget.TextView; public
class
TestActivity extends
Activity { @Override protected
void
onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super .onCreate(savedInstanceState); setContentView(R.layout.test); ImageView iv = (ImageView) findViewById(R.id.test_iv); BitmapDrawable bd=(BitmapDrawable) iv.getBackground(); Bitmap b=bd.getBitmap(); TextView tv = (TextView) findViewById(R.id.test); DisplayMetrics dm = new
DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(dm); int
width = dm.widthPixels; int
height = dm.heightPixels; int
widthdp=DensityManager.px2dip( this , width); int
heightdp=DensityManager.px2dip( this , height); tv.setText( "屏幕密度:" +getResources().getDisplayMetrics().density+ "\n屏幕dp: " +widthdp+ "*" +heightdp+ ""
+ "\n屏幕像素:" +width+ "x" +height+ ""
+ "\n原始像素:256*256\n测试显示:"
+ b.getWidth() + "*"
+ b.getHeight()); } } |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31 |
package
com.peter.androidoverridedtest.util; import
android.content.Context; import
android.util.DisplayMetrics; /** * @class: DensityManager * @Description: TODO * @author: Peter Pan * @email: [email protected] * @date: 2014-1-10 上午10:31:09 * @since: 1.0.0 * */ public
class
DensityManager { /** * 根据手机的分辨率从 dp 的单位 转成为 px(像素) */ public
static
int
dip2px(Context context, float
dpValue) { final
float
scale = context.getResources().getDisplayMetrics().density; return
( int ) (dpValue * scale + 0 .5f); } /** * 根据手机的分辨率从 px(像素) 的单位 转成为 dp */ public
static
int
px2dip(Context context, float
pxValue) { final
float
scale = context.getResources().getDisplayMetrics().density; return
( int ) (pxValue / scale + 0 .5f); } } |
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。