我的任务是与我们现有的 IOS 应用程序一起完成一个 Andoid 应用程序。 Android 的项目框架已经存在,我只需要填补空白即可使其与 IOS 版本保持同步。
我一直在通过自己的手机进行测试,并且一直在为 Galaxy S6 上的字体太大而苦苦挣扎。 现在我刚刚意识到这是由于我的设备上的实际 Zomm 和字体显示设置造成的(我的eyesite 不是最好的)。
我的问题是,是否可以从我的设备检索这些缩放设置,以便我可以相应地调整字体等?
对 Xamarin 来说还很陌生,但我正在努力 - 希望您能提供一些指导来帮助我更进一步。
最佳答案
众所周知,dp和px的换算公式:px = dp * 密度
可见,如果设计宽度为360dp,我们要想保证所有设备计算出来的px值正好是屏幕的宽度,就只能修改密度的值。
通过阅读源代码和official document ,我们可以看到密度是DisplayMetrics中的成员变量,并且DisplayMetrics实例可以通过Resources#getDisplayMetrics获取,并且>资源是通过Activity或Application Context获取的。
我们可以熟悉以下与 DisplayMetrics 中和适配相关的变量:
- 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;
}
也在Activity#onCreate方法中调用。代码比较简单,并且不涉及系统非公开api的调用,所以理论上不会影响app的稳定性。
注意:如果您在系统设置中切换字体然后返回应用程序,字体不会发生变化。所以你必须监听字体切换,调用Application#registerComponentCallbacks来注册onConfigurationChanged
监听器。
关于android - 设备显示设置(Android 屏幕缩放和字体),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55302016/