gpt4 book ai didi

当 CollapsingToolbarLayout 的子项时,不会调用 Android 布局行为

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:30:20 25 4
gpt4 key购买 nike

我正在尝试在 CollapsingToolbarLayout 的子元素上设置 layout_behavior,但从未在 iv_header 上调用该行为看法。当锚定在外部时,它可以完美地工作,例如使用 tv_follow View 。

文档没有具体说明 layout_behavior 不能应用于 AppBarLayoutCollapsingToolbarLayout 所以我不知道为什么它不起作用。

<?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>

行为是从设计支持库中的 FloatingActionButton 代码中提取出来的。

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();
}
}

最佳答案

如果我没记错的话,这条线在你目前拥有的地方是不必要的......

app:layout_behavior="com.package.view.HidingBehavior"

layout_behavior 应该应用于 AppBarLayout 的同级而不是(嵌套的)子级。这是因为它告诉 sibling ,在 CoordinatorLayout 中,他们需要如何协调他们的行为以响应他们正在做的事情。

换句话说,在您拥有它的地方,它不会协调与任何其他 View 的任何行为。

关于当 CollapsingToolbarLayout 的子项时,不会调用 Android 布局行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30785998/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com