在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 neededmResizeableVIEwHeight = mheaderVIEw.getHeight(); // set initial padding if you wish to show the upper area by defaultmPagerAndTabsContainer.setpadding(0,mResizeableVIEwHeight,0); prepareVIEwPager(mVIEwPager); // set the pages and fragments...// init the "touchInterceptionFrameLayout" to handle touch eventsmContentVIEw.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,但这使得复杂性更加糟糕.
总结以上是内存溢出为你收集整理的android – 如何模仿Lollipop的手机应用程序,在可滚动内容之前调整大小的项目大小?全部内容,希望文章能够帮你解决android – 如何模仿Lollipop的手机应用程序,在可滚动内容之前调整大小的项目大小?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)