Android 可设置为随着窗口大小调整缩放比例及设定fixed的窗口大小。对于surface的控制在SurfaceHolder类中进行

而Android 屏幕分辩率中已经有一个类DisplayMetics提供Andorid.util 包下的DisplayMetrics 类提供了一种关于显示的通用信息,如显示大小,分辨率和字体。

为了获取DisplayMetrics 成员,首先初始化一个对象如下:
DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
String str = metrics.toString();
String str = "屏幕分辨率为:" + metrics.widthPixels
+" * "+metrics.heightPixels;
textview.setText(str); //显示

在CTS中有如下一段代码可以体现出不同的单位显示情况:
    public void testAccessTextSize() {        DisplayMetrics metrics = mActivity.getResources().getDisplayMetrics();        mTextView = new TextView(mActivity);        mTextView.setTextSize(TypedValue.COMPLEX_UNIT_PX, 20f);        assertEquals(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_PX, 20f, metrics),                mTextView.getTextSize(), 0.01f);        mTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 20f);        assertEquals(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 20f, metrics),                mTextView.getTextSize(), 0.01f);        mTextView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 20f);        assertEquals(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 20f, metrics),                mTextView.getTextSize(), 0.01f);        // setTextSize by default unit "sp"        mTextView.setTextSize(20f);        assertEquals(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 20f, metrics),                mTextView.getTextSize(), 0.01f);        mTextView.setTextSize(200f);        assertEquals(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 200f, metrics),                mTextView.getTextSize(), 0.01f);    }   


这里面有几个单位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 做单位

程序员通常以像素为单位设计计算机用户界面,但是如果显示分辩率发生变更(更高时),
则以前做的应用界面会相应缩小,所以有必要使用与分辨率无关的度量单位解决此问题。

Android支持下列所有单位:
px(像素):屏幕上的点。
in(英寸):长度单位。
mm(毫米):长度单位。
pt(磅):1/72英寸。
dp(与密度无关的像素):一种基于屏幕密度的抽象单位。在每英寸160点的显示器上,1dp = 1px。
dip:与dp相同,多用于android/ophone示例中。

dp也就是dip。这个和sp基本类似。如果设置表示长度、高度等属性时可以使用dp或sp。但如果
设置字体,需要使用sp。dp是与密度无关,sp除了与密度无关外,还与scale无关。
所以为了使用户界面能够在现在和将来的显示器类型上正常显示,建议大家始终使用sp作为
文字大小的单位,将dip作为其他元素的单位。当然,也可以考虑使用矢量图形,而不是用位图

附带两个问题的解决:
解码图片显示时,设定的density会影响到显示效果

在DisplayMetrics.java中定义的默认值:

    /**     * Standard quantized DPI for low-density screens.     */    public static final int DENSITY_LOW = 120;    /**     * Standard quantized DPI for medium-density screens.     */    public static final int DENSITY_MEDIUM = 160;    /**     * Standard quantized DPI for high-density screens.     */    public static final int DENSITY_HIGH = 240;    /**     * Standard quantized DPI for extra-high-density screens.     */    public static final int DENSITY_XHIGH = 320;            /**     * The reference density used throughout the system.     */    public static final int DENSITY_DEFAULT = DENSITY_MEDIUM;


1、如果图片解码像素高但显示效果不怎么样时,请修改下DENSITY_DEFAULT看个效果
public static final int DENSITY_DEFAULT = DENSITY_XHIGH;

显示例子:
Options opts = new Options();opts.inScaled = false;opts.inSampleSize = 1;opts.inScreenDensity = DisplayMetrics.DENSITY_HIGH;opts.inPreferredConfig = Bitmap.Config.ARGB_8888;mBitmapbg = BitmapFactory.decodeResource(this.getResources(), R.drawable.bj, opts);BitmapDrawable bd = new BitmapDrawable(mBitmapbg);


2、如果图片在不同的显示频率下被放大了,那么有可能与webview相关,这也是density影响的

     /**     * Enum for specifying the WebView's desired density.     * FAR makes 100% looking like in 240dpi     * MEDIUM makes 100% looking like in 160dpi     * CLOSE makes 100% looking like in 120dpi     */    public enum ZoomDensity {        FAR(150),      // 240dpi        MEDIUM(100),    // 160dpi        CLOSE(75);     // 120dpi        ZoomDensity(int size) {            value = size;        }        int value;    }


那么是否可能根据屏幕的分辩率进行动态设定呢?

   int dDensity = getResources().getDisplayMetrics().densityDpi ;     WebSettings.ZoomDensity zDensity = WebSettings.ZoomDensity.MEDIUM ;     switch(dDensity) {     case DisplayMetrics.DENSITY_LOW :       zDensity = WebSettings.ZoomDensity.CLOSE;      break;     case DisplayMetrics.DENSITY_MEDIUM:      zDensity = WebSettings.ZoomDensity.MEDIUM;      break;     case DisplayMetrics.DENSITY_HIGH:      zDensity = WebSettings.ZoomDensity.FAR;       break ;    }    webSettings.setDefaultZoom(zDensity); 

更多相关文章

  1. Android中ScrollView嵌套ListView只显示一行的解决方案
  2. Android充分利用系统状态栏,达到全屏显示,fitSystemWindow失效问题
  3. Android(安卓)P 图像显示系统(三)Android(安卓)HWUI 绘制流程
  4. Android官方推荐使用DialogFragment替换AlertDialog
  5. Android(安卓)Toast优化,不看别后悔
  6. 解决TextView中MaxLines与ellipsize=end冲突问题
  7. ( 转)关于Android的nodpi,xhdpi,hdpi,mdpi,ldpi
  8. android notification
  9. textView属性

随机推荐

  1. Android(安卓)控件GridView的使用
  2. Android(安卓)Call disconnected reason
  3. 关于安卓广播无法启动接收器的问题
  4. Android底层知识Window和WindowManager深
  5. okhttp http 重定向到https
  6. android seekBar ratingBar
  7. Android(安卓)ViewPager动画切换
  8. Android之JitPack快速发布开源库
  9. Instrumentation.java
  10. Android(安卓)设置DrawableRight和Drawab