如何在代码中为新浪博客组件代码设置dip,sp值

android中dip、dp、px、sp和屏幕密度 - 空山不空 - 博客园
1. dip: device independent pixels(设备独立像素). 不同设备有不同的显示效果,这个和设备硬件有关,一般我们为了支持WVGA、HVGA和QVGA 推荐使用这&&& 这个,不依赖像素。 &&& 这里要特别注意dip与屏幕密度有关,而屏幕密度又与具体的硬件有关,硬件设置不正确,有可能导致dip不能正常显示。在屏幕密度为160的显示屏上,1dip=1px,有时候可能你的屏幕分辨率很大如480*800,但是屏幕密度没有正确设置比如说还是160,那么这个时候凡是使用dip的都会显示异常,基本都是显示过小。 &&&& dip的换算: &&&&&&&&&& dip(value)=(int) (px(value)/1.5 + 0.5) 2. dp: 很简单,和dip是一样的。 3. px: pixels(像素),不同的设备不同的显示屏显示效果是相同的,这是绝对像素,是多少就永远是多少不会改变。 4.& sp: scaled pixels(放大像素). 主要用于字体显示best for textsize。
备注: 根据google的推荐,像素统一使用dip,字体统一使用sp&&
举个例子区别px和dip:
px就是像素,如果用px,就会用实际像素画,比个如吧,用画一条长度为240px的横线,在480宽的模拟器上看就是一半的屏宽,而在320宽的模拟器上看就是2/3的屏宽了。
而dip,就是把屏幕的高分成480分,宽分成320分。比如你做一条160dip的横线,无论你在320还480的模拟器上,都是一半屏的长度。
public static int dip2px(Context context, float dipValue){ &&&&&&&&&&&&&&& final float scale = context.getResources().getDisplayMetrics(). &&&&&&&&&&&&&&& return (int)(dipValue * scale + 0.5f); &&&&&&& } &&&&&&& &&& public static int px2dip(Context context, float pxValue){ &&&&&&&&&&&&&&& final float scale = context.getResources().getDisplayMetrics(). &&&&&&&&&&&&&&& return (int)(pxValue / scale + 0.5f); &&&&&&& }&1401人阅读
(一)概念
dip: device independent pixels(设备独立像素). 不同设备有不同的显示效果,这个和设备硬件有关,一般我们为了支持WVGA、HVGA和QVGA 推荐使用这个,不依赖像素。
px: pixels(像素). 不同设备显示效果相同,一般我们HVGA代表320x480像素,这个用的比较多。
pt: point,是一个标准的长度单位,1pt=1/72英寸,用于印刷业,非常简单易用;
sp: scaled pixels(放大像素). 主要用于字体显示best for textsize。
(二)换算(以
sp 和 pt 为例)
通过查看TextView 等类的源码
COMPLEX_UNIT_PX:
case COMPLEX_UNIT_SP:
return value * metrics.scaledD
case COMPLEX_UNIT_PT:
return value * metrics.xdpi * (1.0f/72);
--------------------------
scaledDensity = DENSITY_DEVICE / (float) DENSITY_DEFAULT;
xdpi = DENSITY_DEVICE;
--------------------------
DENSITY_DEFAULT = DENSITY_MEDIUM = 160;
所以: 假设 pt 和 sp 取相同的值 1,则可设 1pt 和 1sp 之间系数为 x,
1 * DENSITY_DEVICE / 72 = x * 1 * DENSITY_DEVICE / 160 =&
x = 160 / 72 = 2.2222
也就是说在 Android 中, 1pt 大概等于 2.22sp
(三)关系与区别
过去,程序员通常以像素为单位设计计算机用户界面。例如,定义一个宽度为300像素的表单字段,列之间的间距为5个像素,图标大小为16×16像素 等。这样处理的问题在于,如果在一个每英寸点数(dpi)更高的新显示器上运行该程序,则用户界面会显得很小。在有些情况下,用户界面可能会小到难以看清 内容。
与分辨率无关的度量单位可以解决这一问题。Android支持下列所有单位。
px(像素):屏幕上的点。
in(英寸):长度单位。
mm(毫米):长度单位。
pt(磅):1/72英寸。
dp(与密度无关的像素):一种基于屏幕密度的抽象单位。在每英寸160点的显示器上,1dp = 1px。
dip:与dp相同,多用于android/ophone示例中。
sp(与刻度无关的像素):与dp类似,但是可以根据用户的字体大小首选项进行缩放。
为了使用户界面能够在现在和将来的显示器类型上正常显示,建议大家始终使用sp作为文字大小的单位,将dip或者dp作为其他元素的单位。当然,也可以考虑使用矢量图形,而不是用位图。
基本单位:
&&px:像素,是屏幕上显示数据的最基本的点。
&&dp(dip):一种基于屏幕密度的抽象单位(与密度无关的像素)。
&&dpi(dots per inch):每英寸所显示的点数(像素),也可称为像素密度。
&&pt(磅):是一个标准的长度单位,1pt=1/72英寸,用于印刷业,非常简单易用。
&&sp(与刻度无关的像素):scaled pixels(放大像素). 主要用于字体显示best for textsize,TextView 的字号可使用 sp 做单位。
屏幕尺寸Screen size:
即显示屏幕的实际大小,按照屏幕的对角线进行测量。
为简单起见,Android把所有的屏幕大小分为四种尺寸:小,普通,大,超大(分别对应:small, normal, large, and extra large).
应用程序可以为这四种尺寸分别提供不同的自定义屏幕布局-平台将根据屏幕实际尺寸选择对应布局进行渲染,这种选择对于程序侧是透明的。
密度Density:
根据像素分辨率,在屏幕指定物理宽高范围内能显示的像素数量。
在同样的宽高区域,低密度的显示屏能显示的像素较少,而高密度的显示屏则能显示更多的像素。
屏幕密度非常重要,因为其它条件不变的情况下,一共宽高固定的UI组件(比如一个按钮)在在低密度的显示屏上显得很大, 而在高密度显示屏上看起来就很小。
为简单起见,Android把所有的屏幕分辨率也分为四种尺寸:小,普通,大,超大(分别对应:small, normal, large, and extra large).
应用程序可以为这四种尺寸分别提供不同的资源-平台将透明的对资源进行缩放以适配指定的屏幕分辨率。
获取屏幕的分辨率:
Android&&提供 DisplayMetircs类可以很方便的获取分辨率,它提供了一种关于显示的通用信息,如显示大小,分辨率和字体。&
为了获取DisplayMetrics&&成员,首先初始化一个对象如下:&
DisplayMetrics metrics&&= new DisplayMetrics();&&
WindowManager WM = (WindowManager)mcontext.getSystemService(Context.WINDOW_SERVICE);
WM.getDefaultDisplay().getMetrics(metrics);
//屏幕的分辨率
int width = dm.widthPixels() ;&
int height = dm.heightPixels();
注:构造函数DisplayMetrics&&不需要传递任何参数;获得WindowManager 之后, getDefaultDisplay()&&方法将取得的默认的显示信息,返回的是一个Display 对象,此对象的getMetrics(Metrics metrics)方法把分辨率信息传到 DisplayMetrics&&对象中。
通过&&DisplayMetrics.toString()方法可以获取到&&DisplayMetrics的大部分信息,以下是模拟器上不同分辨率所有对应的信息:&
QVGA : {density=0.75, width=240, height=320, scaledDensity=0.75, xdpi=120.0, ydpi=120.0}
HVGA :&&{density=1.0, width=320, height=480, scaledDensity=1.0,&xdpi=160.0, ydpi=160.0}
WVGA : {density=1.5, width=480, height=800, scaledDensity=1.5, xdpi=240.0, ydpi=240.0}
其中,density为显示的逻辑分辨率;width及height就为屏幕分辨率(为绝对宽度与高度),与fields中的widthPixels及 heightPixels一致;scaleDensity与density一致;xdpi及ydpi为x方向与y方向的像素密度。
如何计算密度(dpi)
1.标准是240*320画在1.5*2平方inch上。那么像每平方英寸有240*320/(1.5*2)=25600点,也就是一平方英寸的像素点为25600,所以dpi取为它的平方根160;如果你的dpi是120,那么它的密度就是0.75.
2.密度不只是与width有关,还与height有关,所以不管width是1.8还是1.3,它的密度都有可能是1;比如width是1.8,只要它的height是3/1.8的话,如果pixel为240*320的话,它的密度仍旧是1;同样如果width为1.3,只要它的 height为3/1.3的话,像素点为240*320,则密度也是1.
3.320*480/(1.5*2)得到单位平方英寸的点为51200,所以单位平方英寸是240*320画在1.5*2屏幕的2倍。但是这是平方英寸啊,算密度的时候要开平方的啊,所以应该是2开平方,是1.414吧,大致密度为1.5。
px与dip的关系:
Android中,在160dpi (mdpi)中, 1 dip= 1
以此类推,在120dpi(ldpi)中, 1 dip = 0.75
&&&&&&&&&&&&&&&&&&在240dpi (hdpi)中,&&1 dip = 1.5
&&&&&&&&&&&&&&&&&&在320dpi(xhdpi)中, 1dip = 2px;
如何做到与密度无关:
  如果屏幕密度为160,这时dp和sp和px是一样的。1dp=1sp=1px,但如果使用px作单位,如果屏幕大小不变(假设还是3.2寸),而屏幕密度变成了320。那么原来TextView的宽度设成160px,在密度为320的3.2 寸屏幕里看要比在密度为160的3.2寸屏幕上看短了一半。但如果设置成160dp或160sp的话。系统会自动将width属性值设置成320px的。也就是160 * 320 / 160。其中320 / 160可称为密度比例因子。也就是说,如果使用dp和sp,系统会根据屏幕密度的变化自动进行转换。官方文档总结的计算公式为:pixels
= dps * (density /160).
使用dip作为View的单位,这样就可以同时兼容各种不同的分辨率,不会造成UI的不可兼容。
使用dip作为控件的大小单位:
&&&&&1.布局文件:
&&&&&&&&如果使用布局文件的形式定义控件,可直接在 android:layout_width 和 android:layout_height 中使用dip作为单位,来定义View的大&&小,如下:
&&&&&&&&&TextView android:layout_width=&50dip& android:layout_height=&50dip&&&/TextView&
&&&&2.代码形式:
&&&&&&&如果是自定义的View控件,那么可能使用的是代码的形式来布局,比如:
&&&&&&&&MyTextView myTextView = new MyTextView(this);
&&&&&&&&可以调用myTextView.setWidth() 和 setHeight()来设置View宽度和高度,但是这两个方法接收的是以像素单位的值,也就说,如果要用代码的形式来以dip为单位设置View大小,则需要先将dip转换为px。
&&&&&&&&这里可以使用如下方法,如下:
&public static int px2dip(Context context, float pxValue) {&&final float scale = context.getResources().getDisplayMetrics().&return (int) (pxValue / scale + 0.5f) ;&}
public static int dip2px(Context context, float dpValue) {&final float scale = context.getResources().getDisplayMetrics().&return (int) (dpValue * scale + 0.5f) ;&}&将dip数值转换为px后,在调用setWidth() 和setHeight()来设置View宽度和高度。& 默认的控件大小:当在屏幕为160dpi,也就是density为1的情况下,所得到的控件的宽度和高度为android控件的默认的dip大小。比如:Button 的 默认高度为 48dip。状态栏的默认高度为25dip。总结:对于UI布局,要使用dip或者dp作为单位,对应字体要是有sp作为单位,要尽量少使用px作为单位。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:31513次
排名:千里之外
转载:20篇px dip sp_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
上传于||暂无简介
阅读已结束,如果下载本文需要使用0下载券
想免费下载更多文档?
下载文档到电脑,查找使用更方便
还剩5页未读,继续阅读
你可能喜欢Android中px与dip,sp与dip等的转换工具类
public class DisplayUtil {
public static int px2dip(Context context,float pxValue) {
& return (int) (pxValue /
context.getResources().getDisplayMetrics().density + 0.5f);
&public static int dip2px(Context context,float
dipValue) {
& return (int) (dipValue *
context.getResources().getDisplayMetrics().density + 0.5f);
&public static int px2sp(Context context,float
pxValue) {
& return (int) (pxValue /
context.getResources().getDisplayMetrics().scaledDensity +
&public static int sp2px(Context context,float
spValue) {
& return (int) (spValue *
context.getResources().getDisplayMetrics().scaledDensity +
文章中指出在字体小于15sp时,应该多用sp少用dp, 只有在字体比较大的时候, 比如超过了15sp时,
大家这时候就可以考虑用dp试试了.
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

我要回帖

更多关于 易语言代码创建组件 的文章

 

随机推荐