设备显示设置(即Android屏幕缩放和字体)

时间:2019-03-22 14:37:41

标签: android ios xamarin

我受命与现有的IOS应用程序一起完成Andoid应用程序。 Android的项目框架已经存在,我只需要填补空白即可将其与IOS版本配合使用。

我一直在通过自己的手机进行测试,并且一直在为Galaxy S6上的字体过大而苦苦挣扎。 现在我才意识到这是由于设备上实际的Zomm和Font显示设置(我的眼睛不是最好的)。

我的问题是,是否可以从设备中检索这些缩放设置,以便我可以相应地调整字体等?

对于Xamarin来说还很陌生,但是我要到达那里-希望您能找到一些帮助我进一步发展的指针。

1 个答案:

答案 0 :(得分:0)

众所周知,dp和px的转换公式为:px = dp *密度

可以看出,如果设计宽度为360dp,则只有在要确保所有设备计算出的px值正好是屏幕的宽度时,才可以修改density的值。

通过阅读源代码和official document,我们可以看到密度是 DisplayMetrics 中的成员变量,并且 DisplayMetrics 实例可通过< strong> Resources#getDisplayMetrics ,而资源是通过“活动”或“应用程序上下文”获得的。

我们可以熟悉与DisplayMetrics中和适应相关的以下变量:

  • DisplayMetrics#density 是上述密度
  • DisplayMetrics#densityDpi 是以上dpi
  • DisplayMetrics#scaledDensity 字体的缩放比例,即 等于正常条件下的密度,但是会改变 调整系统字体大小后的值。

解决方案:

以下假设设计图的宽度为360dp并适合宽尺寸。

然后,调整后的密度=设备实际宽度(单位px)/ 360,那么我们只需要在系统中修改我们计算出的密度,代码实现如下:

private static void setCustomDensity( Activity activity,Application application)
 {
    DisplayMetrics appDisplaymetrics = application.Resources.DisplayMetrics;
    float targetDensity = appDisplaymetrics.WidthPixels / 360;
    int targetDensityDpi = (int)(160 * targetDensity);

    appDisplaymetrics.Density = appDisplaymetrics.ScaledDensity = targetDensity;
    appDisplaymetrics.DensityDpi = (Android.Util.DisplayMetricsDensity)targetDensityDpi;

    DisplayMetrics activityDisplayMetrics = activity.Resources.DisplayMetrics;
    activityDisplayMetrics.Density = activityDisplayMetrics.ScaledDensity = targetDensity;
    activityDisplayMetrics.DensityDpi = (Android.Util.DisplayMetricsDensity)targetDensityDpi;
}

也称为 Activity#onCreate 方法。该代码相对简单,并且不涉及系统非公共api的调用,因此从理论上讲不会影响应用程序的稳定性。

注意:如果您在系统设置中切换字体,然后返回到应用程序,则字体没有更改。因此,您必须收听字体切换,调用 Application#registerComponentCallbacks 来注册onConfigurationChanged侦听器。