Android中dip, dp, px, sp之间的区别

(文章来自网络) 

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

dip: device independent pixels(设备独立像素). 不同设备有不同的显示效果,这个和设备硬件有关,一般我们为了支持WVGA、HVGA和QVGA 推荐使用这个,不依赖像素。
px: pixels(像素). 不同设备显示效果相同,一般我们HVGA代表320x480像素,这个用的比较多。
pt: point,是一个标准的长度单位,1pt=1/72英寸,用于印刷业,非常简单易用;
sp: scaled pixels(放大像素). 主要用于字体显示best for textsize,根据 google 的建议,TextView 的字号最好使用 sp 做单位,

过去,程序员通常以像素为单位设计计算机用户界面。例如,定义一个宽度为300像素的表单字段,列之间的间距为5个像素,图标大小为16×16像素 等。这样处理的问题在于,如果在一个每英寸点数(dpi)更高的新显示器上运行该程序,则用户界面会显得很小。在有些情况下,用户界面可能会小到难以看清 内容。
与分辨率无关的度量单位可以解决这一问题,Android支持下列所有单位:
px(像素):屏幕上的点。
in(英 寸):长度单位。
mm(毫米):长度单位。
pt(磅):1/72英寸。
dp(与密度无关的像素):一种基于屏幕密度的抽象 单位。在每英寸160点的显示器上,1dp = 1px。
dip:与dp相同,多用于android/ophone示例中。
sp(与 刻度无关的像素):与dp类似,但是可以根据用户的字体大小首选项进行缩放。

我来补充两句:说说dp和sp,dp也就是dip。这个和sp基本类似。如果设置表示长度、高度等属性时可以使用dp或sp。但如果设置字体,需要使用 sp。dp是与密度无关,sp除了与密度无关外,还与scale无关。如果屏幕密度为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,系统会根据屏幕密度的变化自动进行转换。

Android下获取字体宽度的方法

第1种方法:

Rect rect=newRect();
paint.getTextBounds("abcd",0,1, rect);
Log.v("a:","height:"+rect.height()+"width:"+rect.width());

第2种方法:
//字符宽度获取方法:
intwidth=(int)paint.measureText("a",0,1);
Log.v("width:","width:"+width);

Android获取屏幕宽高的两种方法

Display display = getWindowManager().getDefaultDisplay();
Log.i("view" , "height:" +display.getHeight());
Log.i("view" , "width:" +display.getWidth());

DisplayMetrics displayMetrics = getResources().getDisplayMetrics();
Log.i("view" , "height" +displayMetrics.heightPixels);
Log.i("view" , "width" +displayMetrics.widthPixels);



Android可设置为随着窗口大小调整缩放比例,但即便如此,手机程序设计人员还是必须知道手机屏幕的边界,以避免缩放造成的布局变形问题。

手机的分辨率信息是手机的一项重要信息,很好的是,Android已经提供DisplayMetircs类可以很方便的获取分辨率。下面简要介绍DisplayMetics类:

Andorid.util包下的DisplayMetrics类提供了一种关于显示的通用信息,如显示大小,分辨率和字体。

为了获取DisplayMetrics成员,首先初始化一个对象如下:

DisplayMetrics metrics=new DisplayMetrics();

getWindowManager().getDefaultDisplay().getMetrics;

注:构造函数DisplayMetrics不需要传递任何参数;调用getWindowManager()之后,会取得现有Activity的Handle,此时,getDefaultDisplay()方法将取得的宽高维度存放于DisplayMetrics对象中,而取得的宽高维度是以像素为单位(Pixel),“像素”所指的是“绝对像素”而非“相对像素”。

Android获取字体高度和设置行高

文章分类:移动开发  网络中好多资料介绍获取字体高度的方法如下:

Java 代码

  1. publicintgetFontHeight(floatfontSize)
  2. {
  3. Paint paint =newPaint();
  4. paint.setTextSize(fontSize);
  5. FontMetrics fm = paint.getFontMetrics();
  6. return(int) Math.ceil(fm.descent - fm.top) +2;
  7. }

public int getFontHeight(float fontSize) { Paint paint = new Paint(); paint.setTextSize(fontSize); FontMetrics fm = paint.getFontMetrics(); return (int) Math.ceil(fm.descent - fm.top) + 2; }



个人更倾向于以下方式获取字体实际高度:

Java 代码

  1. Math.ceil(fm.descent - fm.ascent)

Math.ceil(fm.descent - fm.ascent)



通过实际的截图对文字高度的确定,后者更准确一些。

有了字体高度信息,就可以添加行与行之间的空隙,调整行高。
个人实现方式如下:

Java 代码

  1. paint.setTextSize(fFontWidth);
  2. FontMetrics fm = paint.getFontMetrics();
  3. fFontHeight = (float)Math.ceil(fm.descent - fm.ascent);
  4. if(fFontHeight > fLineHeight)
  5. {
  6. fMulValue = fLineHeight / fFontHeight;
  7. fAddValue = -1;
  8. }
  9. else
  10. {
  11. fMulValue =1;
  12. fAddValue = fLineHeight - fFontHeight;
  13. }
  14. textViewLeft.setTextSize(fFontWidth);
  15. textViewLeft.setLineSpacing(fAddValue, fMulValue);

paint.setTextSize(fFontWidth); FontMetrics fm = paint.getFontMetrics(); fFontHeight = (float)Math.ceil(fm.descent - fm.ascent); if(fFontHeight > fLineHeight) { fMulValue = fLineHeight / fFontHeight; fAddValue = -1; } else { fMulValue = 1; fAddValue = fLineHeight - fFontHeight; } textViewLeft.setTextSize(fFontWidth); textViewLeft.setLineSpacing(fAddValue, fMulValue);



实践验证这种方式对多种分辨率的屏幕的适应性较强。
以上是个人在实际的功能实现过程中的总结,水平较浅,若看官有不同的看法或者见解,望不惜赐教!

Canvas 作为绘制文本时,使用FontMetrics对象,计算位置的坐标。

它的思路和java.awt.FontMetrics的基本相同。

FontMetrics对象

它以四个基本坐标为基准,分别为:

・FontMetrics.top
・FontMetrics.ascent
・FontMetrics.descent
・FontMetrics.bottom

Java代码

  1. Paint textPaint =newPaint( Paint.ANTI_ALIAS_FLAG);
  2. textPaint.setTextSize(35);
  3. textPaint.setColor( Color.WHITE);
  4. // FontMetrics对象
  5. FontMetrics fontMetrics = textPaint.getFontMetrics();
  6. String text ="abcdefghijklmnopqrstu";
  7. // 计算每一个坐标
  8. floatbaseX =0;
  9. floatbaseY =100;
  10. floattopY = baseY + fontMetrics.top;
  11. floatascentY = baseY + fontMetrics.ascent;
  12. floatdescentY = baseY + fontMetrics.descent;
  13. floatbottomY = baseY + fontMetrics.bottom;
  14. // 绘制文本
  15. canvas.drawText( text, baseX, baseY, textPaint);
  16. // BaseLine描画
  17. Paint baseLinePaint =newPaint( Paint.ANTI_ALIAS_FLAG);>
  18. baseLinePaint.setColor( Color.RED);
  19. canvas.drawLine(0, baseY, getWidth(), baseY, baseLinePaint);
  20. // Base描画
  21. canvas.drawCircle( baseX, baseY,5, baseLinePaint);
  22. // TopLine描画
  23. Paint topLinePaint =newPaint( Paint.ANTI_ALIAS_FLAG);
  24. topLinePaint.setColor( Color.LTGRAY);
  25. canvas.drawLine(0, topY, getWidth(), topY, topLinePaint);
  26. // AscentLine描画
  27. Paint ascentLinePaint =newPaint( Paint.ANTI_ALIAS_FLAG);
  28. ascentLinePaint.setColor( Color.GREEN);
  29. canvas.drawLine(0, ascentY, getWidth(), ascentY, ascentLinePaint);
  30. // DescentLine描画
  31. Paint descentLinePaint =newPaint( Paint.ANTI_ALIAS_FLAG);
  32. descentLinePaint.setColor( Color.YELLOW);
  33. canvas.drawLine(0, descentY, getWidth(), descentY, descentLinePaint);
  34. // ButtomLine描画
  35. Paint bottomLinePaint =newPaint( Paint.ANTI_ALIAS_FLAG);
  36. bottomLinePaint.setColor( Color.MAGENTA);
  37. canvas.drawLine(0, bottomY, getWidth(), bottomY, bottomLinePaint);

Paint textPaint = new Paint( Paint.ANTI_ALIAS_FLAG); textPaint.setTextSize( 35); textPaint.setColor( Color.WHITE); // FontMetrics对象 FontMetrics fontMetrics = textPaint.getFontMetrics(); String text = "abcdefghijklmnopqrstu"; // 计算每一个坐标 float baseX = 0; float baseY = 100; float topY = baseY + fontMetrics.top; float ascentY = baseY + fontMetrics.ascent; float descentY = baseY + fontMetrics.descent; float bottomY = baseY + fontMetrics.bottom; // 绘制文本 canvas.drawText( text, baseX, baseY, textPaint); // BaseLine描画 Paint baseLinePaint = new Paint( Paint.ANTI_ALIAS_FLAG);> baseLinePaint.setColor( Color.RED); canvas.drawLine(0, baseY, getWidth(), baseY, baseLinePaint); // Base描画 canvas.drawCircle( baseX, baseY, 5, baseLinePaint); // TopLine描画 Paint topLinePaint = new Paint( Paint.ANTI_ALIAS_FLAG); topLinePaint.setColor( Color.LTGRAY); canvas.drawLine(0, topY, getWidth(), topY, topLinePaint); // AscentLine描画 Paint ascentLinePaint = new Paint( Paint.ANTI_ALIAS_FLAG); ascentLinePaint.setColor( Color.GREEN); canvas.drawLine(0, ascentY, getWidth(), ascentY, ascentLinePaint); // DescentLine描画 Paint descentLinePaint = new Paint( Paint.ANTI_ALIAS_FLAG); descentLinePaint.setColor( Color.YELLOW); canvas.drawLine(0, descentY, getWidth(), descentY, descentLinePaint); // ButtomLine描画 Paint bottomLinePaint = new Paint( Paint.ANTI_ALIAS_FLAG); bottomLinePaint.setColor( Color.MAGENTA); canvas.drawLine(0, bottomY, getWidth(), bottomY, bottomLinePaint); 

你可能感兴趣的:(android)