首页 > 其他分享 >Android开发 - DisplayMetrics 类控制布局图形的缩放显示解析

Android开发 - DisplayMetrics 类控制布局图形的缩放显示解析

时间:2024-08-19 21:38:03浏览次数:9  
标签:缩放 densityDpi metrics DisplayMetrics import Android 屏幕 android

DisplayMetrics 是什么

  • DisplayMetrics类Android中用于获取设备的显示属性(像素等)

DisplayMetrics 的主要属性

  • metrics.density屏幕密度,用于决定屏幕上每英寸的像素数

    DisplayMetrics metrics = new DisplayMetrics();
    density = metrics.density;
    
    • 常见值0.75(低密度)1.0(中密度)1.5(高密度)2.0(超高密度)
  • metrics.densityDpi屏幕的DPI值,告诉你屏幕的像素密度级别(比如中密度、高清)

    DisplayMetrics metrics = new DisplayMetrics();
    densityDpi = metrics.densityDpi;
    
    • 常见值120(ldpi)160(mdpi)240(hdpi)320(xhdpi)480(xxhdpi)640(xxxhdpi)
  • metrics.widthPixels:屏幕的实际宽度像素

    DisplayMetrics metrics = new DisplayMetrics();
    widthPixels = metrics.widthPixels;
    
  • metrics.heightPixels:屏幕的实际高度像素

    DisplayMetrics metrics = new DisplayMetrics();
    heightPixels = metrics.heightPixels;
    
  • metrics.scaledDensity:字体缩放密度,用于调整字体大小

    DisplayMetrics metrics = new DisplayMetrics();
    scaledDensity = metrics.scaledDensity;
    

代码运用解析

import android.app.Activity;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.util.Log;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 获取 DisplayMetrics 实例
        DisplayMetrics displayMetrics = new DisplayMetrics();

        // 提取各项参数
        // 这些字段分别代表屏幕密度、DPI、宽度、高度和缩放密度
        float density = displayMetrics.density;
        int densityDpi = displayMetrics.densityDpi;
        int widthPixels = displayMetrics.widthPixels;
        int heightPixels = displayMetrics.heightPixels;
        float scaledDensity = displayMetrics.scaledDensity;

        // 打印屏幕信息
        Log.d("DisplayMetrics", "Density: " + density);
        Log.d("DisplayMetrics", "Density DPI: " + densityDpi);
        Log.d("DisplayMetrics", "Width Pixels: " + widthPixels);
        Log.d("DisplayMetrics", "Height Pixels: " + heightPixels);
        Log.d("DisplayMetrics", "Scaled Density: " + scaledDensity);

        // 你可以根据这些信息调整布局或图形的显示
    }
}

常见场景

  • 适配不同屏幕:根据densitydensityDpi调整布局和图片资源,以确保在各种屏幕密度下都能良好显示

  • 计算屏幕尺寸:使用widthPixelsheightPixels来确定屏幕的实际像素大小,从而做进一步的计算或调整

  • 字体大小调整:通过scaledDensity来调整文本的显示,以适应用户设置的字体大小

部分场景代码示例解析

适应不同屏幕密度的图片资源

  • 如果有不同分辨率图片资源(如drawable-mdpi、drawable-hdpi),你可以根据屏幕的密度来选择合适的资源。示例:展示如何获取屏幕密度并应用不同的图片资源

    import android.app.Activity;
    import android.graphics.drawable.Drawable;
    import android.os.Bundle;
    import android.util.DisplayMetrics;
    import android.widget.ImageView;
    
    public class MainActivity extends Activity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            ImageView imageView = findViewById(R.id.imageView);
    
            // 获取屏幕的显示信息
            DisplayMetrics metrics = new DisplayMetrics();
            getWindowManager().getDefaultDisplay().getMetrics(metrics);
    
            // 根据屏幕密度选择合适的图片资源
            int densityDpi = metrics.densityDpi;
            Drawable drawable;
    
            if (densityDpi >= DisplayMetrics.DENSITY_XHIGH) {
                drawable = getResources().getDrawable(R.drawable.image_xhdpi);
            } else if (densityDpi >= DisplayMetrics.DENSITY_HIGH) {
                drawable = getResources().getDrawable(R.drawable.image_hdpi);
            } else {
                drawable = getResources().getDrawable(R.drawable.image_mdpi);
            }
    
            // 使用屏幕密度来选择合适的图片资源,以确保图像在不同设备上的清晰度
            imageView.setImageDrawable(drawable);
        }
    }
    

动态调整字体大小

  • 可以根据屏幕的scaledDensity动态调整字体大小,以便在不同设备上保持一致的可读性

    import android.app.Activity;
    import android.os.Bundle;
    import android.util.DisplayMetrics;
    import android.widget.TextView;
    
    public class MainActivity extends Activity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            TextView textView = findViewById(R.id.textView);
    
            // 获取屏幕的显示信息
            DisplayMetrics metrics = new DisplayMetrics();
            getWindowManager().getDefaultDisplay().getMetrics(metrics);
    
            // 计算适合的字体大小
            float scaledDensity = metrics.scaledDensity;
            float fontSize = 16 * scaledDensity;  // 16sp 转换为 px
    
            // 应用计算得到的字体大小
            // 根据屏幕的缩放密度调整字体大小,确保文字在不同设备上可读
            textView.setTextSize(fontSize);
        }
    }
    

获取屏幕宽高并设置布局

  • 你可以使用屏幕的宽度高度来调整布局,以适应不同尺寸的屏幕

    import android.app.Activity;
    import android.os.Bundle;
    import android.util.DisplayMetrics;
    import android.widget.LinearLayout;
    
    public class MainActivity extends Activity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            LinearLayout layout = findViewById(R.id.layout);
    
            // 获取屏幕的显示信息
            DisplayMetrics metrics = new DisplayMetrics();
            getWindowManager().getDefaultDisplay().getMetrics(metrics);
    
            // 获取屏幕的宽度和高度
            int widthPixels = metrics.widthPixels;
            int heightPixels = metrics.heightPixels;
    
            // 根据屏幕宽度调整布局的宽度
            LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
                    (int) (widthPixels * 0.8),  // 设置宽度为屏幕宽度的80%
                    LinearLayout.LayoutParams.WRAP_CONTENT
            );
            
            // 根据屏幕的实际尺寸来调整布局的大小或位置,优化用户体验
            layout.setLayoutParams(params);
        }
    }
    

标签:缩放,densityDpi,metrics,DisplayMetrics,import,Android,屏幕,android
From: https://www.cnblogs.com/ajunjava/p/18368169

相关文章

  • 手机使用技巧:如何恢复Android手机不见的短信
     在您的Android手机上丢失短信可能是一种令人沮丧的经历,尤其是在文本包含重要信息的情况下。幸运的是,有一些方法可以在Android上恢复已删除的短信。在这篇博文中,我们将讨论几种在Android手机上恢复已删除短信的方法。为什么需要恢复Android手机不见的短信您可能想要在And......
  • Android开发 - HorizontalScrollView 类水平滚动超长视图使用解析
    基本概念HorizontalScrollView是一个容器,它允许包含的内容在水平方向上滚动。如果你有一块内容(比如一张宽大的图片或一个长长的水平列表),HorizontalScrollView能让用户通过左右滑动来查看超出屏幕的部分基本使用在布局文件(如activity_main.xml)中定义一个HorizontalScrol......
  • 秒开WebView?Android性能优化全攻略
    在如今的移动应用时代,用户体验的好坏直接关系到应用的成功与否。而在众多的用户体验因素中,应用的加载速度尤其重要。特别是对于使用 WebView 加载网页的应用,如果加载速度过慢,用户往往会产生不满,从而流失。因此,实现“秒开”WebView成为了开发者必须面对的一项挑战。本文将深......
  • Android usb广播 ACTION_USB_DEVICE_ATTACHED流程源码分析
    整体流程图大概意思就是UsbHostManager启动监控线程,monitorUsbHostBus会调用usb_host_run函数(使用inotify来监听USB设备的插拔)不停的读取bus总线,读取到以后,当1、设备插入:发送广播ACTION_USB_DEVICE_ATTACHED2、设备拔出:发送广播ACTION_USB_DEVICE_DETACHED本篇只分析插入......
  • 高德地图SDK Android版开发 6 显示覆盖物
    高德地图SDKAndroid版开发6显示覆盖物前言地图类中覆盖物的接口覆盖物类Marker示例Polyline示例Polygon示例Arc示例Circle示例移除示例效果图Marker的更多属性常用属性交互动画其它属性折线的更多属性常用属性其它属性多边形的更多属性常用属性其它属性Arc的更多......
  • 【Android驱动12】Modem编译和sim卡配置检测过程
    一,Modem编译1.1查看ReleseNote发现需要查看"Build_Configure_Modem_MOLY"这张表,解压MT67xx_(xxx)_MOLY.LR9.W1444.MD.LWTG.MP.Vx.tar.gz到某文件,并在make目录下查看支持的配置信息1.2执行的命令,开始编译modem,则是./make.sh"SM67xx(Lxx_xxx).mak"new1.3执行perl......
  • Android 13.0 recovery页面旋转180度问题的解决方案
    1.前言在13.0的系统rom定制化开发工作中,在系统中recovery的页面也是相关重要的一部分,在系统recoveryota升级等功能,都是需要recovery功能的,在某些产品定制化中在recovery的时候,发现居然旋转了180度,接下来分析下recovery关于屏幕显示方向的相关源码,来修改这个功能2.recovery......
  • 基于flask+vue框架的基于Android的校园公益管理APP小程序端[开题+论文+程序]-计算机毕
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景在当今社会,随着教育理念的进步和青年学生社会责任感的增强,校园公益活动已成为培养学生综合素质、促进社会和谐的重要途径。然而,传统的公益......
  • Android MTP流程
    概要本文的目的是介绍Android系统中MTP的一些相关知识。主要的内容包括:第1部分MTP简介      对Mtp协议进行简单的介绍。第2部分MTP框架      介绍Android系统下MTP的框架。第3部分MTP启动流程      详细分析MTP服务的启动流程,包括Java层,......
  • 【Java毕设选题推荐】基于SpringBoot的springboot基于Android的房屋租赁App
    前言:我是IT源码社,从事计算机开发行业数年,专注Java领域,专业提供程序设计开发、源码分享、技术指导讲解、定制和毕业设计服务......