android – 如何模仿Lollipop的手机应用程序,在可滚动内容之前调整大小的项目大小?

前端之家收集整理的这篇文章主要介绍了android – 如何模仿Lollipop的手机应用程序,在可滚动内容之前调整大小的项目大小?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
背景

在Lollipop的电话应用程序,当您到达“recents”或“contacts”选项卡,并尝试滚动,首先发生的事情是调整上部区域的大小,其中包括最近的事件和搜索框,因此:

如果RecyclerView上有超过3个项目,只要上部区域缩小到最小尺寸,RecyclerView就不会向下滚动.

向上滚动一样:只要上部区域未完全放大,RecyclerView将不会向上滚动.

问题

我找不到实现此功能的最佳方式.

更具体地说,我有一个调整上限区域的问题,这样它就像在棒棒糖上一样顺利.

为了简化,我只需要调整屏幕的一部分,而不是在手机的应用程序(“最近的事件”和searchBox)上显示的2.

我试过了

有很多事情我试图做:

>使RecyclerView变得与整个屏幕一样大,同时拥有一个假,大,空的标题.当我滚动,我也设置“翻译”到顶部的真实内容.这有一个问题,显示滚动条作为上部区域的一部分(我想在正确的位置显示滚动条).此外,它使它非常复杂,因为您必须处理其他页面的RecyclerViews滚动值.这是一个类似于某些第三方库的解决方案,例如this one(在这里我已经使用了一个布局而不是ImageView,但代码几乎相同).
> RecyclerView在上部区域之下,滚动更改上部区域的layoutParams,类似于我在this post上所做的.
>与2相同,而不是更改LayoutParams,我更改了视图的scaleY.

对于#2和#3,问题是在某些情况下,一旦我收到某个值的Y滚动的事件,我也会得到一个滚动,即使是-Y的相同值(反之亦然)使处理调整大小的效果“跳跃”(上下,即使用户滚动很好).

我猜测为什么会发生这样的情况:当我移动RecyclerView时,用户所做的下一个事件与原来的位置完全不一样,因为我已经改变了RecyclerView的位置或其大小.

我尝试使用setOnTouchListener(甚至连GestureDetectorCompat)和setOnScrollListener.都造成同样的怪异问题.

问题

如何解决这个问题?为什么会这样发生,怎么会不总是发生?

编辑:
我试图改变#2,所以我不会处理RecyclerView的触摸事件,我将处理它的容器的触摸事件(一些LinearLayout).由于某种原因,容器没有响应触摸事件,所以我已经用RelativeLayout替换了它,并且在该布局中的所有内容之上放置一个视图,这将响应触摸事件(并相应地更改上部区域).这是有效的,但是在需要的时候我无法将事件进一步传递给孩子的意见.

我认为最好的是定制RecyclerView(扩展它)触摸处理.也许添加一个用于滚动的侦听器,当RecyclerView即将滚动时,它会询问是否可以,如果没有,则不会尝试滚动直到触摸事件触发并重置其状态.

解决方法

好的,一个解决方案(我仍然不喜欢,但是工作)是使用一个“TouchInterceptionFrameLayout”类(从 the library发现),这将允许你决定何时允许滚动,如果不是,以及当它不应该滚动时,您更改包含寻呼机选项卡和ViewPager的布局的填充(或您想要的).

viewPager& tabs的容器覆盖整个区域,并且具有改变的填充.

这是布局:

<LinearLayout
            android:id="@+id/header"
            android:layout_width="match_parent"
            android:orientation="vertical"
            android:layout_height="wrap_content">
            <!-- put upper content here -->

        </LinearLayout>

        <LinearLayout
            android:id="@+id/pagerAndTabsContainer"
            android:orientation="vertical"
            android:layout_width="match_parent"
            android:layout_height="match_parent">

            <com.astuetz.PagerSlidingTabStrip
                android:id="@+id/viewPagerSlidingTabsStrip"
                android:layout_width="match_parent"
                android:background="@color/default_background"
                android:layout_height="48dip"/>

            <android.support.v4.view.ViewPager
                android:background="@color/default_background"
                android:id="@+id/viewPager"
                android:layout_width="match_parent"
                android:layout_height="match_parent"/>
        </LinearLayout>


    </com.github.ksoichiro.android.observablescrollview.TouchInterceptionFrameLayout>

然后,您需要有一些初始化代码(布局阶段完成后可以获得实际的视图大小):

// the upper area height,that can be shrunk to a size of 0 height when needed
mResizeableViewHeight = mHeaderView.getHeight(); 
// set initial padding if you wish to show the upper area by default
mPagerAndTabsContainer.setPadding(0,mResizeableViewHeight,0); 
prepareViewPager(mViewPager); // set the pages and fragments...
// init the "TouchInterceptionFrameLayout" to handle touch events
mContentView.setScrollInterceptionListener(mInterceptionListener);

在TouchInterceptionFrameLayout.TouchInterceptionListener的“shouldInterceptTouchEvent”函数中,您决定何时应该阻止触摸,并且在此接口的“onMoveMotionEvent”上应该处理阻止的触摸.

对于具有recyclelerView的每个片段,请改用ObservableRecyclerView,并调用这些行:

// get the fragment that shows the screen I've made (with the layout)
    Fragment fragment = getTargetFragment(); 
    // let the recyclerView handle filtered touches 
    mRecyclerView.setTouchInterceptionViewGroup(((IGetContainer) fragment).getContainer());
    // if you wish to put animations when you do a touch-up event,this may be handy (or use onUpOrCancelMotionEvent of the "TouchInterceptionListener" too/instead ) :
    if (fragment instanceof ObservableScrollViewCallbacks)                 
       mRecyclerView.setScrollViewCallbacks((ObservableScrollViewCallbacks) fragment);

我不喜欢这个解决方案,因为它覆盖整个屏幕的触摸包装,因为它导致viewPager的过度(并要求你为它设置一个背景),因为它有点复杂相比,我有心里.这还不如Lollipop的手机应用程序的工作流畅,无论我玩滚动规则多少.

我可以让TouchInterceptionListener开始处理触摸事件,只有它们起源于RecyclerView,但这使得复杂性更加糟糕.

原文链接:https://www.f2er.com/android/313210.html

猜你在找的Android相关文章