【问题标题】:Devices Display Settings (ie Android Screen Zoom & Font)设备显示设置(在 Android 屏幕缩放和字体中)
【发布时间】:2019-03-22 14:37:41
【问题描述】:

我的任务是与我们现有的 IOS 应用一起完成一个 Andoid 应用。 Android 的项目框架已经有了,我只需要填补空白以使其与 IOS 版本同步。

我一直在通过自己的手机进行测试,并且一直在为我的 Galaxy S6 上的字体太大而苦苦挣扎。 现在我刚刚意识到这是由于我设备上的实际 Zomm 和字体显示设置(我的 eyesite 不是最好的)。

我的问题是,是否可以从我的设备中检索这些缩放设置,以便我可以相应地调整字体等?

对 Xamarin 很陌生,但我已经到了那里 - 希望你能得到一些指导来帮助我走得更远。

【问题讨论】:

    标签: android ios xamarin


    【解决方案1】:

    众所周知,dp和px的换算公式:px = dp * density

    可以看出,如果设计的宽度是360dp,要想保证所有设备计算的px值正好是屏幕的宽度,就只能修改ddensity的值。

    通过阅读源码和official document可以看出,密度是DisplayMetrics中的一个成员变量,DisplayMetrics实例可以通过获得Resources#getDisplayMetrics,而Resouces是通过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的调用,理论上不会影响app的稳定性。

    注意:如果您在系统设置中切换字体,然后返回应用程序,字体并没有改变。所以要监听字体切换,调用Application#registerComponentCallbacks注册onConfigurationChanged监听器。

    【讨论】:

    • 非常有帮助。更正一项: 360 应该是 360.0F 。例如,值 1024 产生的 targetDensity 为 0,因为该行在 android 上提供了一个整数结果,然后将其重新转换为 float
    • @Frank 是的,感谢分享更正。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多