• Android 调整屏幕分辩率


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

  • 相关阅读:
    C# String.Format用法和格式说明
    VS2017桌面应用程序打包成.msi或者.exe
    Mysql授权允许远程访问
    C# Winform频繁刷新导致界面闪烁解决方法
    C# 解决窗体闪烁
    C# winform或控制台Properties.Settings.Default的使用及存储位置
    C# 获取计算机cpu,硬盘,内存相关的信息
    C# 多线程多文件批量下载---子线程中更新UI 实例
    Objective-C:NSSet和NSMutbaleSet的用法
    iOS:App上架流程和支付宝支付流程
  • 原文地址:https://www.cnblogs.com/endv/p/16370572.html
Copyright © 2020-2023  润新知