zoukankan      html  css  js  c++  java
  • Android 调整屏幕分辩率

    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);

  • 相关阅读:
    DataAnnotations
    使用BizTalk实现RosettaNet B2B So Easy
    biztalk rosettanet 自定义 pip code
    Debatching(Splitting) XML Message in Orchestration using DefaultPipeline
    Modifying namespace in XML document programmatically
    IIS各个版本中你需要知道的那些事儿
    关于IHttpModule的相关知识总结
    开发设计的一些思想总结
    《ASP.NET SignalR系列》第五课 在MVC中使用SignalR
    《ASP.NET SignalR系列》第四课 SignalR自托管(不用IIS)
  • 原文地址:https://www.cnblogs.com/snake-hand/p/3151370.html
Copyright © 2011-2022 走看看