如何在滚动时修复折叠工具栏中的视图?

出于用户输入的目的,我想实现其中包含两个EditText折叠工具栏。 我正在听这个答案。 答案提供了将两个EditText添加到折叠工具栏的完美解决方案。 但这种行为并不像预期的那样。

我取得了什么:

在此处输入图像描述

预期行为:

在此处输入图像描述

我的XML代码

                       

我知道我可以使用scrollFlag做这种类型的样式。 我读过这篇关于滚动标志的post。 但无法准确找到如何将其用于此目的。
我还想更改EditText的字体大小,如上面的GIF所示。

但第一个问题是如何修复工具栏中的一个视图,并在用户向上滚动时隐藏另一个视图。 如果有人用合适的例子解释,那将是很好的。

我确信Todoist正在采取另一种方式,但仍然……

这是xml布局 。 主要的想法是应该固定的视图应该在Toolbar ,当你要隐藏的另一个视图应该在CollapsingToolbarLayout内部有一个不错的上边距时,以防止重叠:

                    

然后,为了实现相同的字体大小和上边距动画,我们可以实现AppBarLayout.OnOffsetChangedListener并根据滚动偏移更改为我们的属性设置动画。 这是活动类

 public class MainActivity extends AppCompatActivity implements AppBarLayout.OnOffsetChangedListener { private static final float COLLAPSED_TEXT_SIZE_SP = 18f; private static final float COLLAPSED_TOP_MARGIN_DP = 24f; private static final float MARGIN_SCROLLER_MULTIPLIER = 4f; private float expandedTextSize; private float collapsedTextSize; private int expandedTopMargin; private int collapsedTopMargin; private AppBarLayout mAppBarLayout; private Toolbar mToolbar; private TextInputEditText editText; private TextInputLayout textInputLayout; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mToolbar = (Toolbar) findViewById(R.id.toolbar); mAppBarLayout = (AppBarLayout) findViewById(R.id.appbar); editText = (TextInputEditText) findViewById(R.id.title); textInputLayout = (TextInputLayout) findViewById(R.id.lNameLayout); setSupportActionBar(mToolbar); getSupportActionBar().setDisplayHomeAsUpEnabled(true); mAppBarLayout.addOnOffsetChangedListener(this); expandedTextSize = editText.getTextSize(); collapsedTextSize = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, COLLAPSED_TEXT_SIZE_SP, getResources().getDisplayMetrics()); expandedTopMargin = ((ViewGroup.MarginLayoutParams) textInputLayout.getLayoutParams()).topMargin; collapsedTopMargin = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, COLLAPSED_TOP_MARGIN_DP, getResources().getDisplayMetrics()); } @Override public void onOffsetChanged(AppBarLayout appBarLayout, int offset) { int maxScroll = appBarLayout.getTotalScrollRange(); float percentage = (float) Math.abs(offset) / maxScroll; float textSizeDiff = Math.abs(expandedTextSize - collapsedTextSize); int marginDiff = Math.abs(expandedTopMargin - collapsedTopMargin); //change text size along with scrolling editText.setTextSize(TypedValue.COMPLEX_UNIT_PX, expandedTextSize - textSizeDiff * percentage); //change top view margin along with scrolling ((ViewGroup.MarginLayoutParams) textInputLayout.getLayoutParams()).topMargin = (int) (expandedTopMargin - marginDiff * Math.min(1, percentage * MARGIN_SCROLLER_MULTIPLIER)); } @Override public boolean onOptionsItemSelected(MenuItem item) { if (item.getItemId() == android.R.id.home) { finish(); return true; } return super.onOptionsItemSelected(item); } } 

所以,对于扩展状态,我使用了我们在xml中应用的默认值。 对于折叠状态,我已经定义了简单常量。 随意适合您的需求。

请注意,当您向Toolbar添加后退按钮或菜单项时,您应该使用第二个视图(要隐藏的那个)的right边距,因为第一个EditTextToolbar的一部分,因此它的边距将根据您添加的内容进行更改。

结果:

快乐的编码!

像这样编辑你的代码