日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

android像素密度转厘米,Android 屏幕适配-像素密度适配

發布時間:2023/12/16 Android 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android像素密度转厘米,Android 屏幕适配-像素密度适配 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

說明:本文僅為簡單思路,沒有實現項目適用的輪子

通過修改系統像素密度做屏幕適配的主要思路是:

通過修改density, scaleDensity, densityDpi值直接更改系統內部對于

目標尺寸而言的像素密度,達到屏幕適配的目的。

名詞解釋:

density:表示屏幕在一英寸像素點/160 的比值,如果屏幕在一英寸范圍呢的像素點有160個,那么density=1,如果屏幕在一英寸范圍呢的像素點有320個,那么density=2

這里xx英寸一般指屏幕對角線的長度

scaleDensity: 表示字體縮放比例,默認scaleDensity =density

densityDpi: 表示屏幕上每一英寸的像素點有多少個,就是上述的160,320等值

在Android中,控件呈現到屏幕上的尺寸,最終都會換算成像素為單位,也就是px(無論xml中聲明的dp,pt,sp最終都會換算成像素px)

Android xml聲明的尺寸單位是在TypedValue類的applyDimension(int unit, float value, DisplayMetrics metrics)方法中完成轉換的,代碼如下

public static float applyDimension(int unit, float value,

DisplayMetrics metrics)

{

switch (unit) {

case COMPLEX_UNIT_PX:

return value;

case COMPLEX_UNIT_DIP:

return value * metrics.density;

case COMPLEX_UNIT_SP:

return value * metrics.scaledDensity;

case COMPLEX_UNIT_PT:

return value * metrics.xdpi * (1.0f/72);

case COMPLEX_UNIT_IN:

return value * metrics.xdpi;

case COMPLEX_UNIT_MM:

return value * metrics.xdpi * (1.0f/25.4f);

}

return 0;

}

從上面的代碼中也可以看出,修改DisplayMetrics的 density以及scaledDensity可以影響控件最終的像素值

因為Android 的碎片化現象比較嚴重,不同的設備density值可能不一樣,相同分辨率的設備的density值也有可能不一樣,所以調整或優化處理density的值就是一種Android屏幕適配的方案

我們期望的是density隨著屏幕分辨率的變化而變化,也就是相同分辨率的設備,我們希望density的值是相同的

這種思路實現的屏幕適配比較全面,下面貼下代碼,使用的話直接在Activity的setContentView()方法之前調用即可Density.setDensity(getApplication(),this)

或者在Application中通過registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks())注冊Activity的生命周期監聽,在回調方法onActivityCreated(Activity activity, Bundle savedInstanceState)中調用Density.setDensity(Application.this, activity)

public class Density {

private static final float WIDTH = 320;//參考設備的寬,單位是dp 320 / 2 = 160

private static float appDensity;//表示屏幕密度

private static float appScaleDensity; //字體縮放比例,默認appDensity

public static void setDensity(final Application application, Activity activity){

//獲取當前app的屏幕顯示信息

DisplayMetrics displayMetrics = application.getResources().getDisplayMetrics();

if (appDensity == 0){

//初始化賦值操作

appDensity = displayMetrics.density;

appScaleDensity = displayMetrics.scaledDensity;

//添加字體變化監聽回調

application.registerComponentCallbacks(new ComponentCallbacks() {

@Override

public void onConfigurationChanged(Configuration newConfig) {

//字體發生更改,重新對scaleDensity進行賦值

if (newConfig != null && newConfig.fontScale > 0){

appScaleDensity = application.getResources().getDisplayMetrics().scaledDensity;

}

}

@Override

public void onLowMemory() {

}

});

}

//計算目標值density, scaleDensity, densityDpi

float targetDensity = displayMetrics.widthPixels / WIDTH; // 1080 / 360 = 3.0

float targetScaleDensity = targetDensity * (appScaleDensity / appDensity);

int targetDensityDpi = (int) (targetDensity * 160);

//替換Activity的density, scaleDensity, densityDpi

DisplayMetrics dm = activity.getResources().getDisplayMetrics();

dm.density = targetDensity;

dm.scaledDensity = targetScaleDensity;

dm.densityDpi = targetDensityDpi;

}

}

總結

以上是生活随笔為你收集整理的android像素密度转厘米,Android 屏幕适配-像素密度适配的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。