android屏幕适配二

本文介绍了如何在Android应用中获取屏幕的物理尺寸、像素密度等信息,并探讨了模拟器上验证适配正确性的方法,特别是通过调整模拟器的分辨率和DPI。同时,解释了DPI和PPI的区别以及它们在设备显示中的作用。
摘要由CSDN通过智能技术生成

获取屏幕重要信息

package com.koal.devicerule;

import androidx.appcompat.app.AppCompatActivity;

import android.graphics.Point;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.Window;
import android.view.WindowManager;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

    private static final String TAG = "MainActivity";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        TextView tv = findViewById(R.id.tv);
        tv.setText(getPadInfo());
        TextView tv2 = findViewById(R.id.tv_2);
        tv2.setText("在使用模拟器测试布局时设置对应的物理尺寸和dpi(DisplayMetrics.densityDpi)");
    }

    private String getPadInfo() {
//        densityDpi : 就是我们常说的dpi。开发用的值240/360/480,图片是按照他来取的,代表每英寸的点数
//
//        density : 其实是 DPI / (160像素/英寸) 后得到的值。
        //https://blog.csdn.net/u013553529/article/details/126775659
        StringBuffer sb = new StringBuffer();
        DisplayMetrics dm = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(dm);
        Point point = new Point();

        this.getWindowManager().getDefaultDisplay().getRealSize(point);
        double w = point.x * 1.0 / dm.xdpi; // xdpi表示宽度方向上每英寸多少像素
        double h = point.y * 1.0 / dm.ydpi; // unit is inch


        double size = Math.sqrt(w * w + h * h);
        //oppo a5 6.217233666788189
        //荣耀50 6.728603125263468
        sb.append("屏幕物理尺寸:" + size + "英寸\n");
        sb.append("屏幕宽高:" + dm.widthPixels + "*" + dm.heightPixels + "\n");

        //x,y方向的ppi计算,可以计算出dm.xdpi,dm.ydip
        // sb.append("x:::"+dm.widthPixels/w+"y:::"+dm.heightPixels/h+"\n");
        double x = Math.pow(dm.widthPixels, 2) + Math.pow(dm.heightPixels, 2);

        sb.append("对角线每英寸像素数:" + Math.sqrt(x) / size + "\n");
        sb.append("密度dpi(densityDpi):" + dm.densityDpi + "dpi\n");
        int y = dm.densityDpi;
        if (y >= 120 && y < 160) {
            sb.append("屏幕密度:ldpi\n");
        } else if (y >= 160 && y < 240) {

            sb.append("屏幕密度:mdpi\n");
        } else if (y >= 240 && y < 320) {

            sb.append("屏幕密度:hdpi\n");
        } else if (y >= 320 && y < 480) {

            sb.append("屏幕密度:xhdpi\n");
        } else if (y >= 480 && y < 640) {

            sb.append("屏幕密度:xxhdpi\n");
        } else if (y >= 640) {

            sb.append("屏幕密度:xxxhdpi\n");
        }
        sb.append("像素密度:" + dm.density + "\n");
        sb.append("x方向每英寸像素数" + dm.xdpi + "dpi\n");
        sb.append("y方向每英寸像素数" + dm.ydpi + "dpi\n");
        sb.append("dm.scaledDensity(用于字体缩放)" + dm.scaledDensity + "\n");
        sb.append("最小宽度(sw):" + getResources().getConfiguration().smallestScreenWidthDp + "dp\n\n");

        sb.append("说明:密度DPI为开发用基准(160为中等DPI)用于dp和px转换,此值固定不会变动,取值范围为(120/160/240/320/480/640等)当前设备值为:" + dm.densityDpi + "\n\n");
        sb.append("PPI是固定计算的,和分辨率,屏幕尺寸相关。DPI是ROM厂商设定的,不是确定公式计算的。同样的分辨率和屏幕尺寸,只能得到PPI一致。但是这不是实际显示的结果,设置dp值是按照DPI来计算的,这个时候需要看设备实际的DPI值,DPI不同结果不同。厂商可能为了显示效果而设置了不同的density(DPI).\n" +
                "\n"
        );


        return sb.toString();
    }
}

模拟器上如何验证

没有真实设备的情况下,如何验证适配的正确性,那么就要一款模拟器。我在网上找了一款叫mumu的模拟器,可以设置屏幕的分辨率和dpi,(按说应该还需要设置屏幕的物理尺寸,也就是多少英寸,但是发现没有这个参数)

  • 分辨率这个大家都知道,就是宽高的像素数。
  • 这里的dpi填什么呢?我感觉应该填dm.density这个值。对吗?
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值