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



我的任务是与我们现有的IOS应用程序一起完成一个Andoid应用程序。 Android的项目骨架已经存在,我只需要填补空白即可使其与IOS版本保持同步。

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

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

对 Xamarin 来说很陌生,但我正在到达那里 - 希望你能有一些指示来帮助我走得更远。

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

可以看出,如果设计宽度为 360dp,我们要想保证所有设备计算出的 px 值正好是屏幕的宽度,我们只能修改密度的值。

通过阅读源代码和官方文档,我们可以看到密度是 DisplayMetrics 中的一个成员变量,DisplayMetrics实例可以通过Resources#getDisplayMetrics获得资源是通过 Activity 或 Application Context 获得的。

我们可以熟悉以下与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监听器。

最新更新