coordinatorlayout toolbar title居中并且返回按钮变换样式

最近开发一个特效需要使用 Coordinatorlayout+AppBarLayout+CollapsingToolbarLayout+Toolbar 实现一个吸顶的效果。

其中有个需求是toolbar的title居中。

第一步:需要在CollapsingToolbarLayout添加app:collapsedTitleGravity="center";设置收起时CollapsingToolbarLayout的title在toolbar中居中显示。

第二步:app:collapsedTitleTextAppearance="@style/Toolbar.TitleText"设置收起时title文本样式。

第三步:给toolbar设置

app:contentInsetLeft="0dp"

app:contentInsetStart="0dp"

第三步是隐藏的一个坑。一开始没有设置这个title总是中间偏右一些。因为toolbar的center是把左侧的navigater刨除后开始计算的。所以需要设置开始的其实位置。

 

下面一个坑是有个需求,返回按钮上滑到一定位置的时候改变样式,把一个×换成<的图标。

首先因为有要求要title居中,又不想自定义个ToolBar所以直接放弃了使用原生的toolbar的返回按钮。

第二,经过调研发现使用一个和AppBarLayout平级的ImageView也无法满足这个需求。因为当CollapsingToolbarLayout折叠起来以后会覆盖掉返回按钮的ImageView,所以也放弃了。

最后想起来了FloatingActionButton传说这个控件一直在Z轴最上层。最后使用该控件的确实现了需求。布局文件如下。记录下。

<?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"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    android:orientation="vertical"
    tools:context=".ui.mine.MinePageActivityNew">


    <android.support.design.widget.AppBarLayout
        android:id="@+id/app_bar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"

        android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">

        <android.support.design.widget.CollapsingToolbarLayout
            android:id="@+id/collapsing_toolbar_layout"
            android:layout_width="match_parent"
            android:layout_height="260dp"
            app:collapsedTitleGravity="center"
            app:collapsedTitleTextAppearance="@style/Toolbar.TitleText_collapsed"
            app:layout_scrollFlags="scroll|exitUntilCollapsed"
            app:expandedTitleTextAppearance="@style/Toolbar.TitleText_expanded"
            app:expandedTitleGravity="bottom"
            app:expandedTitleMarginBottom="100dp"
            app:contentScrim="@color/white"
            app:expandedTitleMarginStart="30dp"
            app:title=""
            >

            <android.support.v7.widget.Toolbar
                android:id="@+id/toolbar"
                style="@style/Toolbar.TitleText_expanded"
                android:layout_width="match_parent"
                android:layout_height="50dp"
                android:layout_gravity="center_horizontal"
                app:contentInsetLeft="0dp"
                app:contentInsetStart="0dp"
                app:titleTextColor="@color/black"
                android:background="@color/white"
                app:layout_collapseMode="parallax"
                app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
                app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"/>
            <ImageView
                android:layout_marginTop="55dp"
                android:layout_alignParentRight="true"
                android:id="@+id/iv_mine_page_activity_head"
                android:layout_width="@dimen/spacing_40"
                android:layout_height="@dimen/spacing_40"
                android:layout_gravity="right"
                android:layout_marginEnd="@dimen/spacing_26" />

            <TextView
                android:id="@+id/tv_mine_page_activity_follow_count"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginStart="@dimen/spacing_30"
                android:layout_marginTop="95dp"
                android:textColor="@color/grey_999999"
                android:textSize="@dimen/font_11"
                tools:text="" />

                <ImageView
                    android:layout_below="@+id/iv_mine_page_activity_head"
                    android:id="@+id/iv_mine_page_activity_setting"
                    android:layout_width="@dimen/spacing_40"
                    android:layout_height="20dp"
                    android:layout_gravity="right"
                    android:layout_marginTop="120dp"
                    android:layout_alignParentEnd="true"
                    android:layout_marginEnd="@dimen/spacing_26"
                    android:scaleType="centerInside"
                    app:layout_collapseMode="parallax"
                    app:layout_collapseParallaxMultiplier="0.5"
                    android:src="@drawable/icon_mine_setting" />

                <View
                    android:layout_width="match_parent"
                    android:layout_height="1dp"
                    android:layout_marginTop="190dp"/>


        </android.support.design.widget.CollapsingToolbarLayout>

        <android.support.design.widget.TabLayout
            android:id="@+id/tab_layout"
            android:layout_width="match_parent"
            android:layout_height="50dp"
            app:tabTextColor="@color/grey_686868"
            app:tabMode="fixed"
            app:tabMaxWidth="0dp"
            app:tabGravity="fill"
            app:tabIndicatorColor="@color/grey_656565"
            app:tabSelectedTextColor="@color/black_111111"
            android:background="@color/white"
            android:layout_gravity="bottom" >

        </android.support.design.widget.TabLayout>
    </android.support.design.widget.AppBarLayout>


    <android.support.v4.view.ViewPager
        android:id="@+id/vp"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_behavior="@string/appbar_scrolling_view_behavior" />


    <android.support.design.widget.FloatingActionButton
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="20dp"
        android:layout_marginTop="12dp"
        android:elevation="0dp"
        android:translationZ="0dp"
        app:rippleColor="@color/transparent"
        app:layout_collapseMode="pin"
        app:backgroundTint="@color/transparent"
        android:background="@color/transparent"
        app:fabSize="normal"
        app:borderWidth="0dp"
        android:outlineAmbientShadowColor="@color/transparent"
        android:outlineSpotShadowColor="@color/transparent"
        app:layout_behavior="com.xxx.xxxxx.xxxxx.utils.behavior.TranslucentBehavior"/>


</android.support.design.widget.CoordinatorLayout>

app:fabSize="normal" :控件间大小,最后自定义了个<dimen name="design_fab_size_normal" tools:ignore="PrivateResource">30dp</dimen>覆盖原有的属性,可以达到自定义该控件大小,设置的值是该控件的直径。

app:borderWidth="0dp":边线宽度

android:outlineAmbientShadowColor="@color/transparent":周围的阴影颜色

app:rippleColor="@color/transparent":点击的边缘阴影颜色

android:elevation="0dp" :用户设置正常显示的阴影大小

android:translationZ="0dp"击时显示的阴影大小

//android 8.0以后增加两个api可以修改阴影的颜色 8.0一下无效
android:outlineAmbientShadowColor :照射光的颜色 一般没什么作用
android:outlineSpotShadowColor:阴影颜色

下面对应的Behavior文件:

/**
 * Created by Lt on 2020/1/10 14:11.
 * Des:根据AppBarLayout的高度改变返回按钮FloatingActionButton的图标
 */
public class ChangeIconBehavior extends CoordinatorLayout.Behavior<FloatingActionButton> {

    /**标题栏的高度*/
    private int mToolbarHeight = 0;

    public ChangeIconBehavior(Context context, AttributeSet attrs) {
        super(context, attrs);
    }


    //绑定观察控件的方法
    public boolean layoutDependsOn(@NonNull CoordinatorLayout parent, @NonNull FloatingActionButton child, @NonNull View dependency) {
        return dependency instanceof AppBarLayout;
    }

    //根据绑定控件的位置变化来改变观察者控件的背景图片
    @Override
    public boolean onDependentViewChanged(@NonNull CoordinatorLayout parent, @NonNull FloatingActionButton child, @NonNull View dependency) {


        if(mToolbarHeight == 0){
            mToolbarHeight = child.getBottom();
        }

        //计算toolbar从开始移动到最后的百分比
        float percent = Math.abs(dependency.getY()) / mToolbarHeight;

        if(percent > 2.5){
            child.setImageResource(R.drawable.icon_left_back);
        }else{
            child.setImageDrawable(parent.getContext().getDrawable(R.drawable.icon_black_close));
        }
        return true;

    }
}

 

 

心得:

app:layout_behavior这个属性设置的是观察者的控件,就是需要作出变化的那个控件。而且它需要是coordinatorlayout的子标签。被观察者的控件是空过设置描点或者在Behavior文件的layoutDependsOn方法中绑定的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值