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

标签 android ios xamarin

我的任务是与我们现有的 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/

相关文章:

c# - 寻找有关如何在 MVVM C#​​ Xamarin 中实现 "volume"属性的建议

java - 如何将变量放入字符串资源中?

android - 打开应用权限设置

ios - 删除行后,UITableView 不会更新

ios - CALayer 动画的 SpringWithDamping?

android - Xamarin.Forms.Labs Mediapicker 卡在 Android 上尝试使用异步方法从照片库中提取图像

xamarin - 适用于 Xamarin 的 ArcGIS 运行时 SDK?

java - RecyclerView 上的 Android throw Action

java - 项目选定监听器上的 Android 导航菜单未触发

php - 调用第三方网络服务的有效方式