zoukankan      html  css  js  c++  java
  • android学习3——长宽的单位问题dp,px,dpi

    android设备的单位px,pt,dp,sp

    分辨率

    先通俗说下分辨率的概念.可以把屏幕想想成一个个正方形格子组成的.如果横向有1280个格子,竖向有720个格子.那么分辨率就是1280*720.这只是一种通俗的理解,理解到这里做一般开发就够用了.分辨率的严格定义请参考专业文献. 有2种方法可以查设备的分辨率.一种是在命令行执行

    adb shell dumpsys window
    

    在最后部分有类似如下的输出

    WINDOW MANAGER DISPLAY CONTENTS (dumpsys window displays)
      Display: mDisplayId=0
        init=1536x2048 320dpi cur=1536x2048 app=1536x2048 rng=1536x1486-2048x1998
        layoutNeeded=false
    

    分辨率就是1536x2048.
    另外一种是代码实现:

    public class ResolutionActivity extends Activity {
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            Display display = getWindowManager().getDefaultDisplay();
            Point size = new Point();
            display.getSize(size);
            int width = size.x;
            int height = size.y;
            TextView tv = (TextView) findViewById(R.id.tv);
            tv.setText(height + "*" + width);
        }
    }
    

    像素px

    像素是指定一个图片占用多少个格子.指定个某图片(或其它view)的像素后,该图片在不同设备上占的格子数是一样的.用下面的代码定义一个像素为620*900的按钮.

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
                  android:orientation="vertical"
                  android:layout_width="fill_parent"
                  android:layout_height="fill_parent"
            >
        <Button 
                android:layout_width="620px" 
                android:layout_height="900px"
                android:text="Button"/>
    </LinearLayout>
    

    用像素指定宽高,不同分辨率的设备上比例相差很大.影响用户体验.

    设备无关像素dp

    前要讲dpi这个概念,dpi表示像素密度.设备的像素密度可以用下面代码计算.

    import android.app.Activity;
    import android.os.Bundle;
    import android.widget.TextView;
    
    public class CalcDpActivity extends Activity {
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            float xdpi = getResources().getDisplayMetrics().xdpi;
            float ydpi = getResources().getDisplayMetrics().ydpi;
            TextView tv = (TextView) findViewById(R.id.tv);
            tv.setText("xdpi is " + xdpi + ",ydpi is " + ydpi);
        }
    }
    

    dpi表示每英寸的像素数,dpi越大,单位长度内像素就越多.
    px和dp的对应关系为:

    px=dp*dpi/160
    

    公式的实际含义是在密度为160dpi的设备上1dp就是1px;在密度为320dpi的设备上,1dp就是1px就是2像素.

    利用dpi求设备实际尺寸

    dpi表示每英寸的像素数,可以用来求物理尺寸,代码如下:

    package edu.cgxy.unit;
    
    import android.app.Activity;
    import android.graphics.Point;
    import android.os.Bundle;
    import android.util.Log;
    import android.view.Display;
    import android.widget.TextView;
    
    public class CalcDiagonalActivity extends Activity {
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            calc2();
        }
    
        private void calc2() {
            float widthPixels = getResources().getDisplayMetrics().widthPixels;
            float heightPixels = getResources().getDisplayMetrics().heightPixels;
    
            float xdpi = getResources().getDisplayMetrics().xdpi;//x轴dpi
            float ydpi = getResources().getDisplayMetrics().ydpi;//y轴dpi
    
            double x = widthPixels / xdpi;//x轴长度,单位是英寸
            double y = heightPixels / ydpi;//y轴长度,单位是英寸
            Log.i("Loglen", x + "," + y);
            TextView tv = (TextView) findViewById(R.id.tv);
            tv.setText("长" + (x * 2.54) +"厘米,宽" + (y * 2.54) + "厘米,对角线" + Math.sqrt(x * x + y * y) + "英寸");
        }
    }
    
  • 相关阅读:
    DFT
    BSDL
    穆尼里奥:未派上最好点球手;齐达内成功并不意外
    module使用和设置
    APU (美国AMD公司研发的加速处理器)
    Lucio: We avoided Mourinho after every loss
    高位压迫——萨基给世界足坛带来的技术革命
    穆里尼奥:曼联没有在今夏尝试过签下C罗
    Linux 的 Out-of-Memory (OOM) Killer
    shell source命令说明
  • 原文地址:https://www.cnblogs.com/zhouyang209117/p/5003060.html
Copyright © 2011-2022 走看看