zoukankan      html  css  js  c++  java
  • android屏幕适配的全攻略3-动态获取手机屏幕宽高及动态设置控件宽高

    1.获取手机屏幕宽高:

    DisplayMetrics  dm = new DisplayMetrics();     
       
    getWindowManager().getDefaultDisplay().getMetrics(dm);     
       
    int screenWidth = dm.widthPixels;               
       
    int screenHeight = dm.heightPixels;

    22.根据屏幕宽度为控件设置动态设置宽高:

    imageView.setImageResource(R.drawable.newscar);
    LayoutParams params = imageView.getLayoutParams();         
    params.height=screenWidth/10;         
    params.width =screenHeight/10;         
    imageView.setLayoutParams(params);

    注意示例:

    我们需要获取Android手机或Pad的屏幕的物理尺寸,以便于界面的设计或是其他功能的实现。下面就介绍讲一讲如何获取屏幕的物理尺寸

        下面的代码即可获取屏幕的尺寸。
        在一个Activity的onCreate方法中,写入如下代码:

            DisplayMetrics metric = new DisplayMetrics();
            getWindowManager().getDefaultDisplay().getMetrics(metric);
            int width = metric.widthPixels;     // 屏幕宽度(像素)
            int height = metric.heightPixels;   // 屏幕高度(像素)
            float density = metric.density;      // 屏幕密度(0.75 / 1.0 / 1.5)
            int densityDpi = metric.densityDpi;  // 屏幕密度DPI(120 / 160 / 240)

     但是,需要注意的是,在一个低密度的小屏手机上,仅靠上面的代码是不能获取正确的尺寸的。比如说,一部240x320像素的低密度手机,如果运行上述代码,获取到的屏幕尺寸是320x427。因此,研究之后发现,若没有设定多分辨率支持的话,Android系统会将240x320的低密度(120)尺寸转换为中等密度(160)对应的尺寸,这样的话就大大影响了程序的编码。所以,需要在工程的AndroidManifest.xml文件中,加入supports-screens节点,具体的内容如下:      

    <supports-screens
                android:smallScreens="true"
                android:normalScreens="true"
                android:largeScreens="true"
                android:resizeable="true"
                android:anyDensity="true" />
    这样的话,当前的Android程序就支持了多种分辨率,那么就可以得到正确的物理尺寸了。如果没有这几行代码,不管你怎么调整layout中的控件,对应分辨率的手机是没有任何效果的。注意:由于android版本的不同,有些版本不支持xlargeScreens,可以直接将android:xlargeScreens="true"去掉。

    杏总的代码也是按照这种方式来适配屏幕的

        private void layoutAdjust() {
            ECMLog.i_ui(CLASS_TAG, "layoutAdjust called...");
            RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) logoIV.getLayoutParams();
            params.width = 375 * mGlobalData.mScreenWidth / 1080;
            params.height = 394 * mGlobalData.mScreenWidth / 1080;
            params.topMargin = 470 * mGlobalData.mScreenHeight / 1920;
            logoIV.setLayoutParams(params);
    
            zhuanyedemimakaguanjiaIV = (ImageView) findViewById(R.id.zhuanyedemimakaguanjiaIV);
            params = (RelativeLayout.LayoutParams) zhuanyedemimakaguanjiaIV.getLayoutParams();
            params.height = 60 * mGlobalData.mScreenHeight / 1920;
            params.width = 470 * mGlobalData.mScreenWidth / 1080;
            zhuanyedemimakaguanjiaIV.setLayoutParams(params);
    
        }

    给了一个线性布局在1920*1080上的宽度和高度是375*394,现在的在不同的手机分辨率上就可以按照上面的比例来上来动态的设计指定线性布局的大小,满足在不同的手机屏幕分辨率上显示的布局的宽度和高度在不同的手机屏幕上显示的效果是一样的。

     

     动态设置控件的宽度和高度的思路来自于:

    android屏幕适配的全攻略2--支持手机各种屏幕密度dpi

    我们最好按照上面的思路来解决,上面在代码中这样设置这样写主要用于布局控件很少的情况,当布局控件很多的时候,我们在代码中就会写很多代码,这样不太好,按照

    android屏幕适配的全攻略2--支持手机各种屏幕密度dpi中的方法,我们ui设计师给了一个一个控件在1920*1080上面的宽度和高度是375*394

    我们首先打开工程下的:

    找到工程下的values-1920x1080文件夹

    打开文件夹下面的lay_x.xml和lay_y.xml的值

    375px对应在lay_x中的值是:

    394对应在lay_y的值是:

    我们在程序中写代码只需要在xml中进行设置就可以了,代码如下:

    <TextView
            android:text="Hello World!"
            android:background="#809"
            android:layout_width="@dimen/x110"
            android:layout_height="@dimen/y99"/>

    这样我们就能够满足在不同的手机中控件显示的宽度和高度在屏幕中显示的大小是一样的,是不是相当的经典。

    上面的是对控件能够适配,对应图片的适配按照下面的方法

    • 为了让我们提供的图片符合各种屏幕密度的要求。我们需要为不同屏幕密度提供大小不同的图片。
      上篇文章中我们提到了

      在Google官方开发文档中,说明了 mdpi:hdpi:xhdpi:xxhdpi:xxxhdpi=2:3:4:6:8 的尺寸比例进行缩放。例如,一个图标的大小为48×48dp,表示在mdpi上,实际大小为48×48px,在hdpi像素密度上,实际尺寸为mdpi上的1.5倍,即72×72px,以此类推。

    因此,我们要在drawabledrawable-hdpidrawable-mdpidrawable-xdpidrawable-xhdpi等文件夹下放置相同名称、符合上述比例的图片资源。系统会根据屏幕密度的不同,而选择对应的图片进行加载。

    在布局文件中的简单使用:

     <Button
            android:layout_height="wrap_content"
            android:layout_width="wrap_content"
            android:background="@drawable/ic_launcher" />
  • 相关阅读:
    Zookeeper(1)---初识
    golang的一些零散笔记
    ELK使用过程中遇到的一些问题
    ECharts系列:玩转ECharts之常用图(折线、柱状、饼状、散点、关系、树)
    MySQL系列:Docker安装 MySQL提示错误:Access denied for user'root'@'localhost' (using password:yes)
    HTML+CSS系列:登录界面实现
    Apollo系列(二):ASP.NET Core 3.1使用分布式配置中心Apollo
    Apollo系列(一):分布式配置中心Apollo安装(Linux、Docker)
    为你的应用加上skywalking(链路监控)
    工作中,你是如何开始搭建一套容器云环境的呢?
  • 原文地址:https://www.cnblogs.com/kebibuluan/p/6923019.html
Copyright © 2011-2022 走看看