我的任务是与我们现有的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
监听器。