JessYanCoding / AndroidAutoSize

🔥 A low-cost Android screen adaptation solution (今日头条屏幕适配方案终极版,一个极低成本的 Android 屏幕适配方案).
Apache License 2.0
13.47k stars 1.96k forks source link

改变density导致滑动手势的判定出现问题,已附上解决方案。 #443

Open ErgooLee opened 1 year ago

ErgooLee commented 1 year ago

Environment

Bug Description:

ViewConfiguration类中定义了几个滑动和点击之间的判定参数,如mTouchSlop,默认是8dp,档density=2.0时,mTouchSlop=16px,当滑动距离超过这个值时,会判定为滑动,反之则判定为点击。但是AutoSize改变了density,导致mTouchSlop的值同样发生放大或者缩小,进而导致滑动误触或者很难触发滑动。比如我用GestureDetector去判定长按。原本density=2.0,mTouchSlop=16,用auto size后 mTouchSlop=7,导致长按很难触发,会被判定为滑动。

Log:

不需要

Related Code:

可以查看GestureDetector里长按手势的判定逻辑

//判定阈值
  touchSlop = configuration.getScaledTouchSlop();

public static ViewConfiguration get(@NonNull @UiContext Context context) {
        StrictMode.assertConfigurationContext(context, "ViewConfiguration");

        final DisplayMetrics metrics = context.getResources().getDisplayMetrics();
        final int density = (int) (100.0f * metrics.density);

        ViewConfiguration configuration = sConfigurations.get(density);
        if (configuration == null) {
            configuration = new ViewConfiguration(context);
            sConfigurations.put(density, configuration);
        }

        return configuration;
    }

解决方案:

AutoSize应该只改变ui相关的density,非ui相关的density应该还原。 可以通过反射将ViewConfiguration还原。