Android CollapsingToolbarLayout collapse Listener
我正在将
总结一下,在滚动和展开时我想要两个不同的标题。
谢谢大家
我分享了基于@Frodio Beggins和@Nifhel代码的完整实现:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | public abstract class AppBarStateChangeListener implements AppBarLayout.OnOffsetChangedListener { public enum State { EXPANDED, COLLAPSED, IDLE } private State mCurrentState = State.IDLE; @Override public final void onOffsetChanged(AppBarLayout appBarLayout, int i) { if (i == 0) { if (mCurrentState != State.EXPANDED) { onStateChanged(appBarLayout, State.EXPANDED); } mCurrentState = State.EXPANDED; } else if (Math.abs(i) >= appBarLayout.getTotalScrollRange()) { if (mCurrentState != State.COLLAPSED) { onStateChanged(appBarLayout, State.COLLAPSED); } mCurrentState = State.COLLAPSED; } else { if (mCurrentState != State.IDLE) { onStateChanged(appBarLayout, State.IDLE); } mCurrentState = State.IDLE; } } public abstract void onStateChanged(AppBarLayout appBarLayout, State state); } |
然后您可以使用它:
1 2 3 4 5 6 | appBarLayout.addOnOffsetChangedListener(new AppBarStateChangeListener() { @Override public void onStateChanged(AppBarLayout appBarLayout, State state) { Log.d("STATE", state.name()); } }); |
此解决方案非常适合我检测
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | appBarLayout.addOnOffsetChangedListener(new AppBarLayout.OnOffsetChangedListener() { @Override public void onOffsetChanged(AppBarLayout appBarLayout, int verticalOffset) { if (Math.abs(verticalOffset)-appBarLayout.getTotalScrollRange() == 0) { // Collapsed } else { //Expanded } } }); |
在
将
1 2 3 4 5 6 7 8 9 10 11 | mAppBarLayout.addOnOffsetChangedListener(new AppBarLayout.OnOffsetChangedListener() { @Override public void onOffsetChanged(AppBarLayout appBarLayout, int verticalOffset) { if(verticalOffset == 0 || verticalOffset <= mToolbar.getHeight() && !mToolbar.getTitle().equals(mCollapsedTitle)){ mCollapsingToolbar.setTitle(mCollapsedTitle); }else if(!mToolbar.getTitle().equals(mExpandedTitle)){ mCollapsingToolbar.setTitle(mExpandedTitle); } } }); |
这段代码对我有用
1 2 3 4 5 6 7 8 9 | mAppBarLayout.addOnOffsetChangedListener(new AppBarLayout.OnOffsetChangedListener() { @Override public void onOffsetChanged(AppBarLayout appBarLayout, int verticalOffset) { if (verticalOffset == -mCollapsingToolbarLayout.getHeight() + mToolbar.getHeight()) { //toolbar is collapsed here //write your code here } } }); |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | private enum State { EXPANDED, COLLAPSED, IDLE } private void initViews() { final String TAG ="AppBarTest"; final AppBarLayout mAppBarLayout = findViewById(R.id.appbar); mAppBarLayout.addOnOffsetChangedListener(new AppBarLayout.OnOffsetChangedListener() { private State state; @Override public void onOffsetChanged(AppBarLayout appBarLayout, int verticalOffset) { if (verticalOffset == 0) { if (state != State.EXPANDED) { Log.d(TAG,"Expanded"); } state = State.EXPANDED; } else if (Math.abs(verticalOffset) >= appBarLayout.getTotalScrollRange()) { if (state != State.COLLAPSED) { Log.d(TAG,"Collapsed"); } state = State.COLLAPSED; } else { if (state != State.IDLE) { Log.d(TAG,"Idle"); } state = State.IDLE; } } }); } |
您可以使用以下方法获取collapsingToolBar alpha百分比:
1 2 3 4 5 6 | appbarLayout.addOnOffsetChangedListener( new AppBarLayout.OnOffsetChangedListener() { @Override public void onOffsetChanged(AppBarLayout appBarLayout, int verticalOffset) { float percentage = ((float)Math.abs(verticalOffset)/appBarLayout.getTotalScrollRange()); fadedView.setAlpha(percentage); }); |
供参考:链接
这是Kotlin解决方案。将
方法A:
将
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | import com.google.android.material.appbar.AppBarLayout import kotlin.math.abs abstract class AppBarStateChangeListener : AppBarLayout.OnOffsetChangedListener { enum class State { EXPANDED, COLLAPSED, IDLE } private var mCurrentState = State.IDLE override fun onOffsetChanged(appBarLayout: AppBarLayout, i: Int) { if (i == 0 && mCurrentState != State.EXPANDED) { onStateChanged(appBarLayout, State.EXPANDED) mCurrentState = State.EXPANDED } else if (abs(i) >= appBarLayout.totalScrollRange && mCurrentState != State.COLLAPSED) { onStateChanged(appBarLayout, State.COLLAPSED) mCurrentState = State.COLLAPSED } else if (mCurrentState != State.IDLE) { onStateChanged(appBarLayout, State.IDLE) mCurrentState = State.IDLE } } abstract fun onStateChanged( appBarLayout: AppBarLayout?, state: State? ) } |
将侦听器添加到您的
1 2 3 4 5 6 7 8 9 10 11 | appBarLayout.addOnOffsetChangedListener(object: AppBarStateChangeListener() { override fun onStateChanged(appBarLayout: AppBarLayout?, state: State?) { Log.d("State", state.name) when(state) { State.COLLAPSED -> { /* Do something */ } State.EXPANDED -> { /* Do something */ } State.IDLE -> { /* Do something */ } } } } ) |
方法B:
1 2 3 4 5 6 7 8 9 10 | appBarLayout.addOnOffsetChangedListener(AppBarLayout.OnOffsetChangedListener { appBarLayout, verticalOffset -> if (abs(verticalOffset) - appBarLayout.totalScrollRange == 0) { // Collapsed } else if (verticalOffset == 0) { // Expanded } else { // Idle } } ) |
此解决方案为我工作:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | @Override public void onOffsetChanged(AppBarLayout appBarLayout, int i) { if (i == 0) { if (onStateChangeListener != null && state != State.EXPANDED) { onStateChangeListener.onStateChange(State.EXPANDED); } state = State.EXPANDED; } else if (Math.abs(i) >= appBarLayout.getTotalScrollRange()) { if (onStateChangeListener != null && state != State.COLLAPSED) { onStateChangeListener.onStateChange(State.COLLAPSED); } state = State.COLLAPSED; } else { if (onStateChangeListener != null && state != State.IDLE) { onStateChangeListener.onStateChange(State.IDLE); } state = State.IDLE; } } |
在AppBarLayout上使用addOnOffsetChangedListener。
该代码对我来说是完美的。您可以使用百分比刻度
1 2 3 4 5 6 7 8 9 | @Override public void onOffsetChanged(AppBarLayout appBarLayout, int verticalOffset) { double percentage = (double) Math.abs(verticalOffset) / collapsingToolbar.getHeight(); if (percentage > 0.8) { collapsingToolbar.setTitle("Collapsed"); } else { collapsingToolbar.setTitle("Expanded"); } } |
如果您使用的是CollapsingToolBarLayout,则可以将其
1 2 | collapsingToolbar.setExpandedTitleColor(ContextCompat.getColor(activity, android.R.color.transparent)); collapsingToolbar.setTitle(title); |
收合时,展开= 0时我的工具栏偏移值得到-582
所以我通过在Toast中设置offsetvalue查找值并相应地更改代码。
1 2 3 4 5 6 7 8 9 10 11 12 | mAppBarLayout.addOnOffsetChangedListener(new AppBarLayout.OnOffsetChangedListener() { @Override public void onOffsetChanged(AppBarLayout appBarLayout, int verticalOffset) { if(verticalOffset == -582) { Toast.makeText(MainActivity.this,"collaped" + verticalOffset, Toast.LENGTH_SHORT).show(); mCollapsingToolbarLayout.setTitle("Collapsed"); }else if(verticalOffset == 0){ Toast.makeText(MainActivity.this,"expanded" + verticalOffset, Toast.LENGTH_SHORT).show(); mCollapsingToolbarLayout.setTitle("expanded"); } } }); |