因为一个效果中的图片设置了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的实际展示效果的更多相关文章

  1. Android中dip, dp, px,pt, sp之间的区别:

    Android中dip.dp.sp.pt和px的区别   1.概述 过去,程序员通常以像素为单位设计计算机用户界面.例如:图片大小为80×32像素.这样处理的问题在于,如果在一个每英寸点数(dpi)更 ...

  2. Android中的dp, px, pt

    定义: px是像素,表示屏幕显示的最小元素单位 pt是磅数,一磅等于1/72英寸,一般用来作为字体的单位使用 问题: px和pt不使用于手机,因为同样的px在高低分辨率的手机上显示的比例不同 解决办法 ...

  3. 【转】Android中dip(dp)与px之间单位转换

    Android中dip(dp)与px之间单位转换 dp这个单位可能对web开发的人比较陌生,因为一般都是使用px(像素)但是,现在在开始android应用和游戏后,基本上都转换成用dp作用为单位了,因 ...

  4. Android中sp和px之间关系探究

    记得当时在刚接触Android时都在说不要用px,要用sp,所以在实际工作当中当然就按照这个规则,所以都要将px换算成sp,而我在实际工作中的换算规则是dp=px * 1.5,而且用这种规则到现在基本 ...

  5. Android中使用ImageViewSwitcher实现图片切换轮播导航效果

    前面写过了使用ViewFlipper和ViewPager实现屏幕中视图切换的效果(ViewPager未实现轮播)附链接: Android中使用ViewFlipper实现屏幕切换 Android中使用V ...

  6. Android中TextView不获取焦点可以实现跑马灯的效果

    之前在网上找了很多关于TextView的跑马灯效果实现的例子,实现起来都存在一些问题,例如一种是完全重画一个跑马灯,还有就是只设置TextView的相关属性使其具有跑马灯的效果,总的来说这两种方法都是 ...

  7. android中选择控件与选择界面自然过度效果的实现--一种新的交互设计

    转载请标明出处: http://blog.csdn.net/jianghejie123/article/details/40648931 在安卓中经常遇到须要选择一个东西的功能,比方选择日期.选择文件 ...

  8. android中通过自定义xml实现你需要的shape效果 xml属性配置

    在Android开发过程中,经常需要改变控件的默认样式, 那么通常会使用多个图片来解决.不过这种方式可能需要多个图片,比如一个按钮,需要点击时的式样图片,默认的式样图片,然后在写一个selector的 ...

  9. Android中常用单位dp,px,sp之间的相互转换

    MainActivity如下: package cc.testunitswitch; import android.os.Bundle; import android.util.DisplayMetr ...

随机推荐

  1. android_Activity生命周期功能

    说明:初步activity 生命周期7功能. 样本:于MainActivity我加了button,搬家button.跳到OtherActivity.控制台输出的观察. 让我们来看看这些功能: 他们的流 ...

  2. jQuery中的.height()、.innerHeight()和.outerHeight()

    jQuery中的.height()..innerHeight()和.outerHeight()和W3C的盒模型相关的几个获取元素尺寸的方法.对应的宽度获取方法分别为.width()..innerWid ...

  3. Sierpinski三角形

    转载请标明地址:http://www.cnblogs.com/wangmengmeng/ 效果图: 通项公式:An=3的N-1次方 源代码: #include <graphics.h> # ...

  4. js之with

    网上找资料的时候看到有js代码里出现了大量的with语句,有点好奇,这里做下总结: 1)简要说明         with 语句可以方便地用来引用某个特定对象中已有的属性,但是不能用来给对象添加属性. ...

  5. spring4.2完整web项目(使用html视图解析器)

    完整配置springmvc4,最终视图选择的是html,非静态文件. 最近自己配置spring的时候,遇到很多问题,由于开发环境和版本的变化导致网友们给出的建议很多还是不能用的,可能还会有很多人会遇到 ...

  6. mysql_navicat_快捷键

    快捷键能节省很多时间,之前一直研究oracle,plsql有自定义自动补全, 比如 sf 直接回车 可以出现 select * from 等等(参照http://www.cnblogs.com/cph ...

  7. 【转】UiAutomator简要介绍

    原文地址:http://blog.csdn.net/g19920917/article/details/16131565 3.1.必备条件: 1.JDK    2.SDK(API高于15)    3. ...

  8. 在面对变化,撇开NO

    参观后转到供应商,看到自己的生产线流水线半自己的钣金生产线举措.这就是我一直想厂提高生产现场的想法,因为通常当我看到工作人员努力工作和繁忙的生产,只见废现场,线解决方式时,有点莫名的兴奋. 幸亏是一家 ...

  9. 搭建一个BS 的简单SOA 架构(直接通过jquery 调用后台的 wcf 服务的架构)(第一天)

    亲们!还在用传统的三层架构吗?你还在对SOA架构 不了解吗? 那就赶快来学习下一个 比较简单的SOA的架构吧!我会手把手的 教会你们怎么搭建这个 简单的SOA的架构. 其中用的技术点保证  WCF,a ...

  10. 详细的图文介绍如何利用XAMPP本地建站的环境配置教程

    原文:详细的图文介绍如何利用XAMPP本地建站的环境配置教程 WordPress 是一个简便快捷,用途广,人气旺的一个开源的博客建站程序.很有很多等您去发现. 简便快捷:在性能上易于操作.易于浏览: ...