我的任务是与我们现有的 IOS 应用程序一起完成一个 Andoid 应用程序。
Android 的项目框架已经存在,我只需要填补空白即可使其与 IOS 版本保持同步。
我一直在通过自己的手机进行测试,并且一直在为 Galaxy S6 上的字体太大而苦苦挣扎。
现在我刚刚意识到这是由于我的设备上的实际 Zomm 和字体显示设置造成的(我的眼睛位置不是最好的)。
我的问题是,是否可以从我的设备检索这些缩放设置,以便我可以相应地调整字体等?
对 Xamarin 来说还很陌生,但我正在努力 - 希望您能提供一些指导来帮助我进一步发展。
众所周知,dp和px的换算公式:px = dp * 密度
可见,如果设计宽度为360dp,我们要想保证所有设备计算出来的px值正好是屏幕的宽度,就只能修改密度的值。
通过阅读源代码并官方文件 https://developer.android.com/guide/practices/screens_support.html,我们可以看到密度是一个成员变量显示指标,以及显示指标实例可通过资源#getDisplayMetrics,以及Resouces是通过Activity或Application Context获取的。
我们可以熟悉以下与 DisplayMetrics 中和适配相关的变量:
-
显示指标#密度就是上面的密度
-
DisplayMetrics#密度Dpi就是上面的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;
}
也称为活动#onCreate方法。代码比较简单,并且不涉及系统非公开api的调用,所以理论上不会影响app的稳定性。
Note:如果您在系统设置中切换字体,然后返回应用程序,字体并没有改变。所以你必须听字体切换,调用应用程序#registerComponentCallbacks注册onConfigurationChanged
听众。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)