【问题标题】:Decide wether scroll was user initiated or programmatically triggered?决定滚动是看到用户发起还是以编程方式触发?
【发布时间】:2017-01-28 05:57:57
【问题描述】:

只有当HorizontalScrollView 被用户滚动时,某些逻辑才需要在HorizontalScrollView 侦听器中执行,而不是我在其他代码部分调用horizontalScrollView.scrollBy(dx, 0); 方法。

带有标志 - 程序调用已开始,已完成 - 无法真正解决问题,因为在 scrollBy 方法调用和触发事件处理程序之间有一个小的延迟。但是在这个时间范围内,甚至用户都可以触摸和滚动HorizontalScrollView

你会建议什么方法?

horizontalScrollView.getViewTreeObserver().addOnScrollChangedListener(new ViewTreeObserver.OnScrollChangedListener() {

        @Override
        public void onScrollChanged() {

            if (horizontalState == 0) {
                horizontalState = 2;
            }

            if (horizontalState == 2) {

                int d = ...;

                if (d != 0) {
                    userSettingRecycleView.scrollBy(d , 0);

                } else {
                    horizontalState = 0;
                }
            }
        }
    });

userSettingRecycleView.addOnScrollListener(new RecyclerView.OnScrollListener(){
            @Override
            public void onScrolled(RecyclerView recyclerView, int dx, int dy){

                if (horizontalState == 1) {

                    super.onScrolled(recyclerView, dx, dy);
                    horizontalScrollView.scrollBy(dx, 0);
                }
            }

            @Override
            public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
                super.onScrollStateChanged(recyclerView, newState);

                if (newState == RecyclerView.SCROLL_STATE_DRAGGING) {

                    ItemUserSettingRatingActivity.horizontalState = 1;
                }

                if (newState == RecyclerView.SCROLL_STATE_IDLE || newState == RecyclerView.SCROLL_STATE_SETTLING) {
                    ItemUserSettingRatingActivity.horizontalState = 0;
                }
            }
        });

【问题讨论】:

    标签: android horizontal-scrolling horizontalscrollview


    【解决方案1】:

    使用SCROLL_STATE_DRAGGING

    private val scrollListener = object : RecyclerView.OnScrollListener() {
        override fun onScrollStateChanged(recyclerView: RecyclerView?, newState: Int) {
            super.onScrollStateChanged(recyclerView, newState)
            if (newState == SCROLL_STATE_DRAGGING) ViewHelpers.hideKeyboard(activity)
        }
    }
    

    【讨论】:

      【解决方案2】:

      我建议在您的程序scrool 事件之间禁用用户触摸。也就是说,使用those 类来创建您的自定义HorisontalScrollView 并以编程方式启用/禁用水龙头的捕捉。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-05-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-30
        • 1970-01-01
        相关资源
        最近更新 更多