Android中的dp,px以及wrap_content的实际展示效果
因为一个效果中的图片设置了wrap_content的属性,但在720dp跟540dp上面显示不一致使老大非常恼火。跟他讲也讲不明白。于是乎让我们彼此测试来探个究竟。首先测试的是个图片:

它的物理像素是256*256的。
首先是个简单的测试布局,一个textview显示测试结果,一个imageview用来展示这张图片。
<?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,唉,最讨厌前台销售人员了,尽是忽悠~
下面是两个测试文件:
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());
}
}
package com.peter.androidoverridedtest.util; import android.content.Context;
import android.util.DisplayMetrics; /**
* @class: DensityManager
* @Description: TODO
* @author: Peter Pan
* @email: happychinapc@gmail.com
* @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);
}
}
Android中的dp,px以及wrap_content的实际展示效果的更多相关文章
- Android中dip, dp, px,pt, sp之间的区别:
Android中dip.dp.sp.pt和px的区别 1.概述 过去,程序员通常以像素为单位设计计算机用户界面.例如:图片大小为80×32像素.这样处理的问题在于,如果在一个每英寸点数(dpi)更 ...
- Android中的dp, px, pt
定义: px是像素,表示屏幕显示的最小元素单位 pt是磅数,一磅等于1/72英寸,一般用来作为字体的单位使用 问题: px和pt不使用于手机,因为同样的px在高低分辨率的手机上显示的比例不同 解决办法 ...
- 【转】Android中dip(dp)与px之间单位转换
Android中dip(dp)与px之间单位转换 dp这个单位可能对web开发的人比较陌生,因为一般都是使用px(像素)但是,现在在开始android应用和游戏后,基本上都转换成用dp作用为单位了,因 ...
- Android中sp和px之间关系探究
记得当时在刚接触Android时都在说不要用px,要用sp,所以在实际工作当中当然就按照这个规则,所以都要将px换算成sp,而我在实际工作中的换算规则是dp=px * 1.5,而且用这种规则到现在基本 ...
- Android中使用ImageViewSwitcher实现图片切换轮播导航效果
前面写过了使用ViewFlipper和ViewPager实现屏幕中视图切换的效果(ViewPager未实现轮播)附链接: Android中使用ViewFlipper实现屏幕切换 Android中使用V ...
- Android中TextView不获取焦点可以实现跑马灯的效果
之前在网上找了很多关于TextView的跑马灯效果实现的例子,实现起来都存在一些问题,例如一种是完全重画一个跑马灯,还有就是只设置TextView的相关属性使其具有跑马灯的效果,总的来说这两种方法都是 ...
- android中选择控件与选择界面自然过度效果的实现--一种新的交互设计
转载请标明出处: http://blog.csdn.net/jianghejie123/article/details/40648931 在安卓中经常遇到须要选择一个东西的功能,比方选择日期.选择文件 ...
- android中通过自定义xml实现你需要的shape效果 xml属性配置
在Android开发过程中,经常需要改变控件的默认样式, 那么通常会使用多个图片来解决.不过这种方式可能需要多个图片,比如一个按钮,需要点击时的式样图片,默认的式样图片,然后在写一个selector的 ...
- Android中常用单位dp,px,sp之间的相互转换
MainActivity如下: package cc.testunitswitch; import android.os.Bundle; import android.util.DisplayMetr ...
随机推荐
- JS日期显示格式 yyyy-MM-dd hh:mm:ss
1.字符串转换为日期 Date.parse() 可以把 Date.toString() 和 Date.toUTCString()返回的字符串转换为日期类型 2.日期对象转换 ...
- 一Flash从入门开发者放弃了成长之路
本文将依照入门.成长.转行三个关键词来讲述作者这些年使用Flash进行项目开发的整个历史过程. 一.入门--開始走上Flash的道路. 和Flash的机缘要从大学时代说起.2005年下半年.学校开设了 ...
- oracle 监控执行的sql语句
oracle 监控执行的sql语句 select * from v$sqlarea a where module='PL/SQL Developer' order by a.FIRST_LOAD_TI ...
- hdu2602 Bone Collector (01背包)
本文来源于:http://blog.csdn.net/svitter 题意:典型到不能再典型的01背包.给了我一遍AC的快感. //================================== ...
- uva10827-Maximum sum on a torus(矩阵最大和的变形)
题目;uva10827-Maximum sum on a torus(矩阵最大和的变形) 题目大意:就是uva108的变形,矩阵能够连通,就是能够从后面连到前面.这里把矩阵复制三遍,然后又一次生成一个 ...
- Android入门——电话拨号器和4种点击事件
关于HelloWorld为,电话拨号程序还AndroidA入门demo,从这个样例我们要理清楚做安卓项目的思路. 大体分为三步: 1.理解需求,理清思路 2.设计UI 3.代码实现 电话拨号器 1. ...
- jQuery 的 serializeArray()、serialize() 方法
serializeArray()方法说明: 实例 输出以数组形式序列化表单值的结果: $("button").click(function(){ x=$("form&qu ...
- crawler_URL编码原理详解
经常写爬虫的童鞋,难免要处理含有中文的url,大部分时间,都知道url_encode,各个语言也都有支持,今天简单整理下原理,供大家科普 1.特征: 如果URL中含有非ASCII字符的话, 浏览器会对 ...
- oracle_根据ID(字符型)建立分区表
方案思路:有一张暴增的数据表(10亿级别),以后需求需要提高单条查询性能, 这个表有个唯一ID, 假设是UUID,采用区分首字母的方法,不同字母的数据入到不同的物理文件中. 第一步: 查找数据库服务器 ...
- 求解决!!!SystemVerilog于ModelSim在编译和执行
我们正在学习SV流程,样品执行书.. 功能:函数返回数组. Code1: /*书上提供的样例.存在错误,不可执行 function void init(ref int f[5], int start) ...