1.像素

老子曾说“天下难事必作于易,天下大事必作于细”,Android开发也是一样,再复杂的App也无非就是数百万个像素点的排列组合。像素虽然看似简单,但是里面大有学问。如果在开发时对像素单位不以为然仅仅一根筋的填数字,最后在模拟器上取得很好效果的界面在真机上也可能东倒西歪,这就是没打好基础的缘故。接下来通过介绍像素的基本概念及单位间的相互转化来进一步理解像素。

Android支持的像素单位有px、in、mm、dp、sp等。其中,px是手机屏幕上可显示的最小的单位,它与物理设备的显示屏有关。dp与物理设备无关,只与屏幕的尺寸有关,一般来说,同样尺寸的屏幕以dp计算的分辨率是一样的。sp的原理跟dp差不多,专门用于设置字体大小,通过sp设置的字体可以在系统设置字体大小(小、普通、大、超大)时有不同的显示效果。

dp和px的联系取决于具体设备上的像素密度,像素密度就是DisplayMetries里的density参数,当density=1.0时代表1dp=1px,当density=1.5时代表2dp=3px。具体的转换函数如下:

//根据手机的分辨率从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); //四舍五入取整
}

我们可以将以上转换函数封装到一个工具类中,方便以后使用

在xml布局文件中,为了让不同设备屏幕拥有统一的显示效果,除了sp用于设置文字大小外,其余要用尺寸的地方都用dp,在代码中的情况又有所不同,Android用于设置大小的函数都是以px为单位,无论是LayoutParams里的width和height,还是setMargins和setPadding,参数单位都是px,要想在代码中设置布局大小或间距,得先把dp值转换成px值,代码应用如下:

     //将10dp对应的尺寸大小转换为对应的px数值
int dip_10=Utils.dip2px(this,10L);
//从布局文件中获取名叫tv_padding的文本视图
TextView tv_padding=findViewById(R.id.tv_padding);
//设置该文本视图的内部文字与控件四周的间隔大小
tv_padding.setPadding(dip_10,dip_10,dip_10,dip_10);

2.屏幕分辨率

在APP代码中时常要取手机的屏幕分辨率(当前屏幕的宽和高),然后动态调整界面上的布局。在代码中获取分辨率就是获取DisplayMetrics对象,然后从该对象中获得宽、高、像素密度等信息。下面是DisplayMetrics类的常用属性说明:

  ·widthPixels:以px为单位计量的宽度值

  ·heightPixels:以px为单位计量的高度值

  ·density:像素密度,即一个dp单位包含多少个px单位

下面是获取当前屏幕的宽度、高度的示例,像素密度的获取上面代码已经给出,不再重复

public static int getScreenWidth(Context context){
//从系统服务中获取窗口管理器
WindowManager windowManager=(WindowManager)context.getSystemService(context.WINDOW_SERVICE);
DisplayMetrics displayMetrics=new DisplayMetrics();
//从默认显示器中获取显示参数保存到displayMetrics对象中
windowManager.getDefaultDisplay().getMetrics(displayMetrics);
return displayMetrics.widthPixels; //返回屏幕的宽度数值
} public static int getScreenHeight(Context context){
//从系统服务中获取窗口管理器
WindowManager windowManager=(WindowManager)context.getSystemService(context.WINDOW_SERVICE);
DisplayMetrics displayMetrics=new DisplayMetrics();
//从默认显示器中获取显示参数保存到displayMetrics对象中
windowManager.getDefaultDisplay().getMetrics(displayMetrics);
return displayMetrics.heightPixels; //返回屏幕的高度数值
}

在接入设备上获得分辨率信息显示如下:

3.颜色

在Android中,颜色值由透明度alpha和RGB三原色定义,有八位十六进制和六位十六进制两种编码,其中需要注意的是,六位十六进制编码有两种情况,在XML文件中默认不透明(透明度为FF),在代码中默认透明(透明度为00),下面的代码分别给两个文本控件设置六位编码和八位编码的背景色。

        TextView tv2= (TextView) findViewById(R.id.tv2);
tv2.setBackgroundColor(0x00ff00);
TextView tv3= (TextView) findViewById(R.id.tv3);
tv3.setBackgroundColor(0xff00ff00);

可以看到,代码使用六位编码看不到任何背景,使用八位编码能看到正确的绿色背景。

所以代码中一般不用六位编码,因为使用了和不使用没什么区别。

Android显示单元--像素、分辨率、颜色的更多相关文章

  1. Android学习路径(四)文件项目学习的名单,android显示单元经常使用的

    1.的该项目文件所谓名单AndroidManifest.xml文件.该文件,但有很大的利用,例:app名字.图标,app支持的版本app等等.以下我就介绍下这个清单文件的各个參数的作用. <ma ...

  2. DLP显示单元(威创)

    品牌:威创型号:E-SX675生产商:广东威创视讯科技股份有限公司1.生厂商简介(1)生产商概述广东威创视讯科技股份有限公司(简称威创)成立于2002年,专业从事大屏幕拼接显示产品及其解决方案的研发. ...

  3. android DisplayMetrics 获取屏幕分辨率

    Android 提供DisplayMetircs 类可以很方便的获取分辨率.下面介绍 DisplayMetics 类: Andorid.util 包下的DisplayMetrics 类提供了一种关于显 ...

  4. 像素,分辨率,PPI(像素密度),BPP 扫盲

    像素于分辨率 像素,又称画素,为图像显示的基本单位,译自英文“pixel”,pix是英语单词picture的常用简写,加上英语单词“元素”element,就得到pixel,故“像素”表示“图像元素”之 ...

  5. 说明位图,矢量图,像素,分辨率,PPI,DPI?

    说明位图,矢量图,像素,分辨率,PPI,DPI? 显示全部 关注者 28 被浏览 7,031 关注问题写回答 ​邀请回答 ​添加评论 ​分享 ​     2 个回答 默认排序 刘凯   21 人赞同了 ...

  6. DevExpress控件-GridControl根据条件改变单元格/行颜色--转载

    DevExpress控件-数据控件GridControl,有时我们需要根据特定条件改变符合条件的行或者单元格颜色达到突出显示目的,现在动起鼠标跟我一起操作吧,对的,要达到这个目的您甚至都不用动键盘. ...

  7. CxGrid 改变某行或单元格的颜色

    CxGrid 改变某行或单元格的颜色   一个表(T)的结构结构如下. ID Test 1 20012 14443 17885 26456 4568 cxGrid成功连接到该表, 如果要实现单元格特效 ...

  8. Android Studio 修改Logcat的颜色

    在Android Studio里面默认的logcat显示颜色是灰色的,不同等级的log是没有颜色分别的,如图 这一点远不如Eclipse好看,但是Android Studio的logcat的颜色其实也 ...

  9. DevExpress控件-GridControl根据条件改变单元格/行颜色(Dev GridControl 单元格着色) z

    DevExpress控件-数据控件GridControl,有时我们需要根据特定条件改变符合条件的行或者单元格颜色达到突出显示目的,现在动起鼠标跟我一起操作吧,对的,要达到这个目的您甚至都不用动键盘. ...

随机推荐

  1. Codeforces_825

    A.连续1的个数,0用来分割,注意连续的0. #include<bits/stdc++.h> using namespace std; int n; string s; int main( ...

  2. 题解【RQNOJ PID497 0/1字串问题】

    \[ \texttt{Description} \] 编程找出符合下列条件的字符串:①字符串中仅包含 0 和 1 两个字符:②字符串的长度为 n :③字符串中不包含连续重复三次的子串. \[ \tex ...

  3. js算法题

    //较Low,看到的大神 帮补充 1.给定一个数组:,定义一个函数获取数组中所有的奇数,返回一个新数组:var arr1=[1,3,4,5,6,7,8,3,4,2,3,6];    function ...

  4. 青石巷-小L的爸爸

    小L有一个和谐的家. 爸爸具体职业不明,在统战部工作,刚开始和妈妈在一起工作. 妈妈是个会跳舞的语文老师. 奶奶之前也是个老师. 爷爷是个建筑师. 爸爸是最有文采的一个.在小L看来,他的一言一行,一举 ...

  5. 康拓展开 & 逆康拓展开 知识总结(树状数组优化)

    康拓展开 : 康拓展开,难道他是要飞翔吗?哈哈,当然不是了,康拓具体是哪位大叔,我也不清楚,重要的是 我们需要用到它后面的展开,提到展开,与数学相关的,肯定是一个式子或者一个数进行分解,即 展开. 到 ...

  6. [Effective Java 读书笔记] 第二章 创建和销毁对象 第二条

    第二条 遇到多个构造器参数时,可以考虑用构建器 当遇到有多个构造器参数时,常见的是用重叠构造器,即: public class TestClass{ public TestClass(int para ...

  7. 《Head first设计模式》之单例模式

    单例模式(书中叫单件模式,个人习惯叫单例)确保一个类只有一个实例,并提供一个全局访问点. 有一些对象我们只需要一个,比方说:线程池.缓存.对话框.处理器偏好设置和注册表的对象等等.事实上,这类对象只能 ...

  8. centos 7安装reids

    一.reids下载  下载地址: https://redis.io/ 二.解压安装 ① 解压:tar -zxvf redis-5.0.5.tar.gz ② 安装环境:yum install gcc-c ...

  9. 论文翻译:2015_DNN-Based Speech Bandwidth Expansion and Its Application to Adding High-Frequency Missing Features for Automatic Speech Recognition of Narrowband Speech

    论文地址:基于DNN的语音带宽扩展及其在窄带语音自动识别中加入高频缺失特征的应用 论文代码:github 博客作者:凌逆战 博客地址:https://www.cnblogs.com/LXP-Never ...

  10. xmppmini 项目详解:一步一步从原理跟我学实用 xmpp 技术开发 2.登录的实现

    第二章登录的实现 金庸<倚天屠龙记> 张三丰缓缓摇头,说道:“少林派累积千年,方得达成这等绝技,决非一蹴而至,就算是绝顶聪明之人,也无法自创.”他顿了一顿,又道:“我当年在少林寺中住过,只 ...