这里我有一个相当复杂的动画,可以用一个简单的方法来解决(我相信)。它有三种状态:
初始(左屏幕)-完全显示标题视图(橙色
背景):工具栏,灰色圆形(实际上是一张照片)
加上下面的其他视图(文本视图、分级栏等)
向上滚动内容(中间
screen)-roundrect正在放大,其上的绿色前景alpha级别不断变化,因此在滚动时变为绿色(好吧,在这些屏幕上并不明显)。绿色背景实际上是一个缩放的圆形矩形,其上有一个绿色前景,这就是标题背景变为绿色而不是橙色的原因)
再次滚动(右屏幕)-应向上滚动页眉的其余部分
向下滚动内容会相应地导致视图以相反的方式出现。
CoordinatorLayout
我有一些经验与协调布局,但我真的不知道我如何处理2个锚点。我知道滚动标记是如何工作的,也知道如何缩放(第2页)和更改前景alpha,我需要一个自定义的android - 具有多个捕捉点的CoordinatorLayout-LMLPHP实现,但目前我还不知道如何在一个复杂的环境中处理所有这些。
到目前为止我只发现了BehaviorSaúl Molinero's tutorial
因此,请为这里糟糕的描述抱歉,我当然会更新我的问题,并将添加源代码时,我有一些成功的这个问题,但现在我很高兴得到一些提示,也许或教程我错过了。希望有人有类似的项目。
这是我的this tutorial with examples代码,test repo是指向layout.xml文件的链接。

最佳答案

只需按如下所示设置滚动标志,就可以获得两个捕捉点:

<android.support.design.widget.CollapsingToolbarLayout
    ...stuff...
    app:layout_scrollFlags="scroll|enterAlways|snap">

因此,完全展开是一个停止点,只有工具栏可见是第二个停止点。当视图进一步滚动时,工具栏将消失。所以当你向上滚动时,这就是你想要的工作方式。
现在,当应用程序条完全折叠时,应用程序条将在向下滚动时立即显示。这并不奇怪,因为enterAlways就是这样做的。如果内容的顶部已被滚动出视图,则在应用程序栏完全展开之前,您不会再看到它。所以,如果这是你想要的行为,我们就到此为止。
但是,我认为您需要的是上面概述的退出行为,但具有不同的进入行为。如果按如下方式设置滚动标志,则将获得延迟输入行为:
<android.support.design.widget.CollapsingToolbarLayout
    ...stuff...
    app:layout_scrollFlags="scroll|snap">

这只是删除了enterAlways标志。有了这些滚动标志,应用程序条将不会重新出现(一旦折叠),直到内容的顶部可见并“拉”到视图中的应用程序条。
因此,一个解决方案(可能有很多)是编写一个新的行为,附加到AppBarLayout一些代码中,这些代码将在应用程序栏完全折叠后更改滚动标志,并在再次打开时更改它们。这样,您就可以将行为更改为所需的行为,并且仍然可以使用android机器来确定视图级别的特定操作。这可以在自定义视图或活动中完成,只要您可以访问应用程序栏的滚动状态和滚动标志。它也可以在行为中完成,但那可能不是最好的地方。
哦,正如你所发现的,在API 26上抓拍是一件麻烦事。
这是这个概念的一个实现。为了简单起见,实现是在一个活动中进行的:
android - 具有多个捕捉点的CoordinatorLayout-LMLPHP
滚动活动.java
public class ScrollingActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_scrolling);

        final AppBarLayout appBar = (AppBarLayout) findViewById(R.id.app_bar);

        appBar.post(new Runnable() {
            @Override
            public void run() {
                CollapsingToolbarLayout toolbarLayout =
                    (CollapsingToolbarLayout) findViewById(R.id.toolbar_layout);
                setupAppBar(appBar, toolbarLayout);
            }
        });
    }

    private void setupAppBar(AppBarLayout appBar, final CollapsingToolbarLayout toolbarLayout) {
        // Scroll range is positive but offsets are negative. Make signs agree for camparisons.
        final int mScrollRange = -appBar.getTotalScrollRange();

        appBar.addOnOffsetChangedListener(new AppBarLayout.OnOffsetChangedListener() {
            private boolean mAppBarCollapsed = false;

            @Override
            public void onOffsetChanged(AppBarLayout appBarLayout, int verticalOffset) {
                if (verticalOffset == mScrollRange) { // App bar just collapsed
                    mAppBarCollapsed = true;
                    AppBarLayout.LayoutParams lp =
                        (AppBarLayout.LayoutParams) toolbarLayout.getLayoutParams();
                    int flags = lp.getScrollFlags()
                        & ~AppBarLayout.LayoutParams.SCROLL_FLAG_ENTER_ALWAYS;
                    lp.setScrollFlags(flags);
                    toolbarLayout.setLayoutParams(lp);
                } else if (mAppBarCollapsed) { // App bar is opening back up
                    mAppBarCollapsed = false;
                    AppBarLayout.LayoutParams lp =
                        (AppBarLayout.LayoutParams) toolbarLayout.getLayoutParams();
                    int flags = lp.getScrollFlags()
                        | AppBarLayout.LayoutParams.SCROLL_FLAG_ENTER_ALWAYS;
                    lp.setScrollFlags(flags);
                    toolbarLayout.setLayoutParams(lp);
                }
            }
        });
    }
}

10-08 02:54