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 屏幕适配-像素密度适配的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关于语法节点Tree、类型Type和符号
- 下一篇: PDFjs的使用说明书