Android 屏幕分辩率相关问题

jopen 12年前
     <p><span style="font-size:18px;">Android 屏幕分辩率相关问题:</span></p>    <p><span style="font-size:18px;"><span style="white-space:pre;"><br /> </span></span></p>    <span style="font-size:18px;">Android 可设置为随着窗口大小调整缩放比例及设定fixed的窗口大小。<br /> 对于surface的控制在SurfaceHolder类中进行<br /> 而Android 屏幕分辩率中已经有一个类DisplayMetics提供<br /> <br /> Andorid.util 包下的DisplayMetrics 类提供了一种关于显示的通用信息,如显示大小,分辨率和字体。<br /> <br /> 为了获取DisplayMetrics 成员,首先初始化一个对象如下:<br /> DisplayMetrics metrics = new DisplayMetrics();<br /> getWindowManager().getDefaultDisplay().getMetrics(metrics);<br /> String str = metrics.toString();<br /> String str = "屏幕分辨率为:" + metrics.widthPixels<br />                 +" * "+metrics.heightPixels;<br />         textview.setText(str); //显示<br />     <br /> 在CTS中有如下一段代码可以体现出不同的单位显示情况:<br />     public void testAccessTextSize() {<br />         DisplayMetrics metrics = mActivity.getResources().getDisplayMetrics();<br /> <br /> <br />         mTextView = new TextView(mActivity);<br />         mTextView.setTextSize(TypedValue.COMPLEX_UNIT_PX, 20f);<br />         assertEquals(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_PX, 20f, metrics),<br />                 mTextView.getTextSize(), 0.01f);<br /> <br /> <br />         mTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 20f);<br />         assertEquals(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 20f, metrics),<br />                 mTextView.getTextSize(), 0.01f);<br /> <br /> <br />         mTextView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 20f);<br />         assertEquals(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 20f, metrics),<br />                 mTextView.getTextSize(), 0.01f);<br /> <br /> <br />         // setTextSize by default unit "sp"<br />         mTextView.setTextSize(20f);<br />         assertEquals(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 20f, metrics),<br />                 mTextView.getTextSize(), 0.01f);<br /> <br /> <br />         mTextView.setTextSize(200f);<br />         assertEquals(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 200f, metrics),<br />                 mTextView.getTextSize(), 0.01f);<br />     }<br />    <br /> <br /> 这里面有几个单位dip, dp, px, sp概念必须了解一下先:<br /> dip: device independent pixels(设备独立像素). 不同设备有不同的显示效果,<br />     这个和设备硬件有关,一般我们为了支持WVGA、HVGA和QVGA 推荐使用这个,不依赖像素。 <br /> px: pixels(像素). 不同设备显示效果相同,一般我们HVGA代表320x480像素,这个用的比较多。 <br /> pt: point,是一个标准的长度单位,1pt=1/72英寸,用于印刷业,非常简单易用; <br /> sp: scaled pixels(放大像素). 主要用于字体显示best for textsize,根据 google 的建议,<br />    TextView 的字号最好使用 sp 做单位<br />    <br /> 程序员通常以像素为单位设计计算机用户界面,但是如果显示分辩率发生变更(更高时),<br /> 则以前做的应用界面会相应缩小,所以有必要使用与分辨率无关的度量单位解决此问题。<br /> <br /> Android支持下列所有单位:<br /> px(像素):屏幕上的点。 <br /> in(英寸):长度单位。 <br /> mm(毫米):长度单位。 <br /> pt(磅):1/72英寸。 <br /> dp(与密度无关的像素):一种基于屏幕密度的抽象单位。在每英寸160点的显示器上,1dp = 1px。<br /> dip:与dp相同,多用于android/ophone示例中。<br /> <br /> dp也就是dip。这个和sp基本类似。如果设置表示长度、高度等属性时可以使用dp或sp。但如果<br /> 设置字体,需要使用sp。dp是与密度无关,sp除了与密度无关外,还与scale无关。<span style="white-space:pre;"> </span><br /> 所以为了使用户界面能够在现在和将来的显示器类型上正常显示,建议大家始终使用sp作为<br /> 文字大小的单位,将dip作为其他元素的单位。当然,也可以考虑使用矢量图形,而不是用位图<br /> <br /> 附带两个问题的解决:<br /> 解码图片显示时,设定的density会影响到显示效果<br /> <br /> 在DisplayMetrics.java中定义的默认值:<span style="white-space:pre;"> </span><br />     /**<br />      * Standard quantized DPI for low-density screens.<br />      */<br />     public static final int DENSITY_LOW = 120;<br /> <br /> <br />     /**<br />      * Standard quantized DPI for medium-density screens.<br />      */<br />     public static final int DENSITY_MEDIUM = 160;<br /> <br /> <br />     /**<br />      * Standard quantized DPI for high-density screens.<br />      */<br />     public static final int DENSITY_HIGH = 240;<br /> <br /> <br />     /**<br />      * Standard quantized DPI for extra-high-density screens.<br />      */<br />     public static final int DENSITY_XHIGH = 320;    <br />     <br />     /**<br />      * The reference density used throughout the system.<br />      */<br />     public static final int DENSITY_DEFAULT = DENSITY_MEDIUM;<span style="white-space:pre;"> </span><br />     <br />     1、如果图片解码像素高但显示效果不怎么样时,请修改下DENSITY_DEFAULT看个效果<br />     public static final int DENSITY_DEFAULT = DENSITY_XHIGH;<br />     <br />     显示例子:<br /> Options opts = new Options();<br /> opts.inScaled = false;<br /> opts.inSampleSize = 1;<br /> <br /> <br /> opts.inScreenDensity = DisplayMetrics.DENSITY_HIGH;<br /> opts.inPreferredConfig = Bitmap.Config.ARGB_8888;<br /> mBitmapbg = BitmapFactory.decodeResource(this.getResources(), R.drawable.bj, opts);<br /> BitmapDrawable bd = new BitmapDrawable(mBitmapbg);<br />     <br />     2、如果图片在不同的显示频率下被放大了,那么有可能与webview相关,这也是density影响的<br />     <br />      /**<br />      * Enum for specifying the WebView's desired density.<br />      * FAR makes 100% looking like in 240dpi<br />      * MEDIUM makes 100% looking like in 160dpi<br />      * CLOSE makes 100% looking like in 120dpi<br />      */<br />     public enum ZoomDensity {<br />         FAR(150),      // 240dpi<br />         MEDIUM(100),    // 160dpi<br />         CLOSE(75);     // 120dpi<br />         ZoomDensity(int size) {<br />             value = size;<br />         }<br />         int value;<br />     }<br />     <br />     那么是否可能根据屏幕的分辩率进行动态设定呢?<br />     int dDensity = getResources().getDisplayMetrics().densityDpi ; <br />     WebSettings.ZoomDensity zDensity = WebSettings.ZoomDensity.MEDIUM ; <br />     switch(dDensity) {<br />     <span style="white-space:pre;"> </span>case DisplayMetrics.DENSITY_LOW :  <br />     <span style="white-space:pre;"> </span>zDensity = WebSettings.ZoomDensity.CLOSE; <br />     <span style="white-space:pre;"> </span>break;<br />     <span style="white-space:pre;"> </span>case DisplayMetrics.DENSITY_MEDIUM: <br />     <span style="white-space:pre;"> </span>zDensity = WebSettings.ZoomDensity.MEDIUM; <br />     <span style="white-space:pre;"> </span>break;<br />     <span style="white-space:pre;"> </span>case DisplayMetrics.DENSITY_HIGH: <br />     <span style="white-space:pre;"> </span>zDensity = WebSettings.ZoomDensity.FAR;  <br />     <span style="white-space:pre;"> </span>break ;<br />     }<br />     webSettings.setDefaultZoom(zDensity); </span>