Tôi đang cố gắng đặt layout_behavior
trên phần tử là con của CollapsingToolbarLayout
nhưng hành vi không bao giờ được gọi trên chế độ xem iv_header
. Nó hoạt động hoàn hảo khi neo bên ngoài như với chế độ xem tv_follow
.Hành vi bố cục Android không được gọi khi con của CollapsingToolbarLayout
Tài liệu không cụ thể nói rằng không thể áp dụng layout_behavior
trong số AppBarLayout
hoặc CollapsingToolbarLayout
vì vậy tôi không biết tại sao tài liệu không hoạt động.
<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.design.widget.AppBarLayout
android:id="@+id/header"
android:layout_width="match_parent"
android:layout_height="@dimen/full_header_height"
android:focusable="true"
android:focusableInTouchMode="true">
<android.support.design.widget.CollapsingToolbarLayout
android:id="@+id/collapsing_toolbar"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_scrollFlags="scroll|exitUntilCollapsed">
<ImageView
android:id="@+id/iv_header"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scaleType="centerCrop"
android:contentDescription="@null"
app:layout_behavior="com.package.view.HidingBehavior"
app:layout_collapseMode="parallax"
android:src="@drawable/profile_background"/>
<android.support.v7.widget.Toolbar
android:id="@+id/header_toolbar"
android:layout_height="@dimen/action_bar_height"
android:layout_width="match_parent"
android:background="@drawable/toolbar_dark_gradient_half"
android:gravity="top"
app:layout_collapseMode="pin"/>
</android.support.design.widget.CollapsingToolbarLayout>
</android.support.design.widget.AppBarLayout>
<android.support.v4.view.ViewPager
android:id="@+id/pager"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior"/>
<TextView
android:id="@+id/tv_follow"
android:textSize="20sp"
android:textColor="@android:color/white"
android:text="@string/follow"
android:drawableLeft="@drawable/comm_follow"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_anchor="@id/header"
app:layout_anchorGravity="center"
app:layout_behavior="com.package.view.HidingBehavior"
android:drawablePadding="8dp"
android:gravity="center"
android:visibility="gone"
android:fitsSystemWindows="true"/>
</android.support.design.widget.CoordinatorLayout>
Hành vi được lấy ra khỏi FloatingActionButton code trong thư viện hỗ trợ thiết kế.
public class HidingBehavior extends CoordinatorLayout.Behavior<View>{
private Rect tmpRect;
private boolean isAnimatingOut;
private FastOutSlowInInterpolator fastOutSlowInInterpolator = new FastOutSlowInInterpolator();
public HidingBehavior() {
}
public HidingBehavior(Context context, AttributeSet attrs) {
super();
}
@Override
public boolean layoutDependsOn(CoordinatorLayout parent, View child, View dependency) {
return dependency instanceof AppBarLayout;
}
@Override
public boolean onDependentViewChanged(CoordinatorLayout parent, View child, View dependency) {
if (dependency instanceof AppBarLayout) {
AppBarLayout appBarLayout = (AppBarLayout) dependency;
if (this.tmpRect == null) {
this.tmpRect = new Rect();
}
Rect rect = this.tmpRect;
ViewGroupUtils.getDescendantRect(parent, dependency, rect);
if (rect.bottom <= getMinimumHeightForContext(appBarLayout)) {
if(!this.isAnimatingOut && child.getVisibility() == View.VISIBLE) {
this.animateOut(child);
}
} else if(child.getVisibility() != View.VISIBLE) {
this.animateIn(child);
}
}
return false;
}
private int getMinimumHeightForContext(AppBarLayout appBarLayout) {
int minHeight = ViewCompat.getMinimumHeight(appBarLayout);
if(minHeight != 0) {
return minHeight*2;
} else {
int childCount = appBarLayout.getChildCount();
return childCount >= 1?ViewCompat.getMinimumHeight(appBarLayout.getChildAt(childCount - 1))*2:0;
}
}
private void animateIn(View view) {
view.setVisibility(View.VISIBLE);
ViewCompat.animate(view)
.scaleX(1.0F)
.scaleY(1.0F)
.alpha(1.0F)
.setInterpolator(fastOutSlowInInterpolator)
.withLayer()
.setListener((ViewPropertyAnimatorListener)null).start();
}
private void animateOut(final View view) {
ViewCompat.animate(view)
.scaleX(0.0F)
.scaleY(0.0F)
.alpha(0.0F)
.setInterpolator(fastOutSlowInInterpolator)
.withLayer()
.setListener(new ViewPropertyAnimatorListener() {
public void onAnimationStart(View view) {
HidingBehavior.this.isAnimatingOut = true;
}
public void onAnimationCancel(View view) {
HidingBehavior.this.isAnimatingOut = false;
}
public void onAnimationEnd(View view) {
HidingBehavior.this.isAnimatingOut = false;
view.setVisibility(View.GONE);
}
}).start();
}
}
Ok, điều này có ý nghĩa. Tôi muốn nhìn của tôi để thu nhỏ với CollapsingToolbarLayout và chứa một hành vi cụ thể. Có vẻ như tôi sẽ phải kết hợp cả hai thành một Hành vi mà tôi đính kèm với tư cách là anh chị em của AppBarLayout. Cảm ơn! – bolder5
tuyệt vời ... bạn đã cứu tôi! Cảm ơn. –