我受命与现有的IOS应用程序一起完成Andoid应用程序。 Android的项目框架已经存在,我只需要填补空白即可将其与IOS版本配合使用。
我一直在通过自己的手机进行测试,并且一直在为Galaxy S6上的字体过大而苦苦挣扎。 现在我才意识到这是由于设备上实际的Zomm和Font显示设置(我的眼睛不是最好的)。
我的问题是,是否可以从设备中检索这些缩放设置,以便我可以相应地调整字体等?
对于Xamarin来说还很陌生,但是我要到达那里-希望您能找到一些帮助我进一步发展的指针。
答案 0 :(得分:0)
众所周知,dp和px的转换公式为:px = dp *密度
可以看出,如果设计宽度为360dp,则只有在要确保所有设备计算出的px值正好是屏幕的宽度时,才可以修改density的值。
通过阅读源代码和official document,我们可以看到密度是 DisplayMetrics 中的成员变量,并且 DisplayMetrics 实例可通过< strong> Resources#getDisplayMetrics ,而资源是通过“活动”或“应用程序上下文”获得的。
我们可以熟悉与DisplayMetrics中和适应相关的以下变量:
解决方案:
以下假设设计图的宽度为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
侦听器。