Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

关于兼容部分rom缩放模式的问题 #66

Closed
xiang23 opened this issue Oct 24, 2018 · 8 comments
Closed

关于兼容部分rom缩放模式的问题 #66

xiang23 opened this issue Oct 24, 2018 · 8 comments

Comments

@xiang23
Copy link

xiang23 commented Oct 24, 2018

是这样的,有部分品牌的rom有特殊的缩放模式(三星,好像魅族也有)
8351e5faca5c5f077e2789451432848f
可以看到不同于分屏,这种模式下宽高都可以比较随意的改变。

当改变时view宽高时,按ScreenUtils.getScreenSize的逻辑的话就会发生差异
image
上面的那个是按ScreenUtils.getScreenSize取的
下面的那个是按context.getResources().getDisplayMetrics()取的
可以看到明显不一致

事实上对普通手机分屏模式下应当也取的不一样

@JessYanCoding
Copy link
Owner

JessYanCoding commented Oct 24, 2018

你好,我现在没有你说的此类设备,对你说的这种模式也不是很了解,不过,AndroidAutoSize 提供了 AutoSizeConfig#setScreenWidth 和 AutoSizeConfig#setScreenHeight,你可在进入这个模式,或在这个模式下用户改变高宽时自行将你上面获取到的正确的高宽尺寸赋予给框架

这里还需要注意一点,在此模式下,用户改变高宽时,如果这时布局的所有 View 并没有重新绘制,那今日头条屏幕适配方案对这种模式是无论如何都不可能兼容的,因为今日头条屏幕适配的本质是只是修改 dp 转 px 的算法,影响 px 的最终结果,如果系统不调用 TypedValue#applyDimension 重新设置各个 view 的 px 值,那这个方案也将无济于事

@xiang23
Copy link
Author

xiang23 commented Oct 24, 2018

这种模式会重建所有的view,我现在的处理方案就是手动使用setScreenWidth 和setScreenHeight是可以的。
7.0以后手机的使用分屏应该也会出现这种问题。
高改变了与ScreenUtils.getScreenSize()取到的应该也不一致,如果此时使用基于高的适配那么应该就能复现。

@JessYanCoding
Copy link
Owner

JessYanCoding commented Oct 24, 2018

如果 ScreenUtils.getScreenSize() 中直接修改为返回 context.getResources().getDisplayMetrics() 中的高宽尺寸,按你的说法应该可以解决分屏和缩放模式,但我怕这会引起其他的问题,或者其他用户的某些需求不能实现,所以我还是建议先不修改,继续使用现有的方式,分屏和缩放模式这种特殊需求,通过单独的方法手动设置 AutoSizeConfig#setScreenWidth 和 AutoSizeConfig#setScreenHeight 来解决,所以希望你能提供你设置 AutoSizeConfig#setScreenWidth 的具体代码(在哪个时机调用的),我把这个 issues 提到常见 issues 中,让后续有同样问题的使用者能够看到

@xiang23
Copy link
Author

xiang23 commented Oct 24, 2018

我是在基类自己调用
AutoSize.autoConvertDensityOfGlobal(_mActivity)
进行适配的,所以只是在这句话之前重设而已
类似这样
image
因为我是fragment所以是在onCreateView设置的.

或许可以开放一个接口允许在执行适配函数之前执行回调?(或者什么更好的方法)

@xiang23 xiang23 closed this as completed Oct 25, 2018
@xiang23
Copy link
Author

xiang23 commented Oct 25, 2018

发现三星的话如果缩放和分屏甚至有可能不重建view,但是把适配方法设置的参数还原了...要比较完美适配可能recyclerview或者viewpager等里面都要手动调用适配方法。。先放着了毕竟三星国内少数,有空再想象有什么比较好的方法

@JessYanCoding
Copy link
Owner

JessYanCoding commented Oct 25, 2018

我可以按照你上面的建议提供一个在适配函数执行前后都会回调的监听器,你看这样能否解决这个问题,如果不重建 view 的话,那这个方案可能就没办法了,现在的屏幕适配方案基本都要依赖于 View 的绘制来实现...

@JessYanCoding
Copy link
Owner

54a166c

@JessYanCoding
Copy link
Owner

JessYanCoding commented Nov 9, 2018

AutoSizeConfig.getInstance()
                //屏幕适配监听器
                .setOnAdaptListener(new onAdaptListener() {
                    @Override
                    public void onAdaptBefore(Object target, Activity activity) {
                        //使用以下代码, 可支持 Android 的分屏或缩放模式, 但前提是在分屏或缩放模式下当用户改变您 App 的窗口大小时
                        //系统会重绘当前的页面, 经测试在某些机型, 某些情况下系统不会重绘当前页面, ScreenUtils.getScreenSize(activity) 的参数一定要不要传 Application!!!
                        AutoSizeConfig.getInstance().setScreenWidth(ScreenUtils.getScreenSize(activity)[0]);
                        AutoSizeConfig.getInstance().setScreenHeight(ScreenUtils.getScreenSize(activity)[1]);
                    }

                    @Override
                    public void onAdaptAfter(Object target, Activity activity) {
                        
                    }
                });

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants