美文网首页Android资源收录Android技术知识Android开发
Android自定义Behavior(1)-给你想要的PgOne

Android自定义Behavior(1)-给你想要的PgOne

作者: 任珉豪 | 来源:发表于2017-08-22 11:14 被阅读155次

    效果图

    2017-08-22 11_01_38.gif

    思路

    用自定义Behavior来做

    xml文件代码

      <?xml version="1.0" encoding="utf-8"?>
    <android.support.design.widget.CoordinatorLayout
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    >
    
    <android.support.design.widget.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
    
        <android.support.design.widget.CollapsingToolbarLayout
            app:layout_scrollFlags="scroll|snap|exitUntilCollapsed"
            android:layout_width="match_parent"
            android:layout_height="wrap_content">
            <ImageView
                android:scaleType="centerCrop"
                android:src="@mipmap/pg_one"
                app:layout_collapseMode="parallax"
                android:layout_width="match_parent"
                android:layout_height="300dp" />
    
            <FrameLayout
                app:layout_collapseParallaxMultiplier="0.3"
                app:layout_collapseMode="parallax"
                android:id="@+id/fl_view_1"
                android:layout_gravity="bottom"
                android:layout_width="match_parent"
                android:layout_height="100dp">
    
            </FrameLayout>
    
        </android.support.design.widget.CollapsingToolbarLayout>
    
    </android.support.design.widget.AppBarLayout>
    
    <android.support.v4.widget.NestedScrollView
        app:behavior_overlapTop="30dp"
        app:layout_behavior="@string/appbar_scrolling_view_behavior"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        <include layout="@layout/include_eleme" />
    </android.support.v4.widget.NestedScrollView>
    
    <android.support.v7.widget.Toolbar
        android:background="#FF6749CA"
        app:layout_anchor="@id/fl_view_1"
        android:id="@+id/tool_bar_view_1"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize">
    
    </android.support.v7.widget.Toolbar>
    
    
    <TextView
        android:layout_marginRight="40dp"
        android:layout_gravity="center|right"
        android:textStyle="bold"
        android:textColor="@color/white"
        android:textSize="30sp"
        android:text="PgOne"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:layout_behavior="@string/view_behavior_1"/>
    </android.support.design.widget.CoordinatorLayout>
    

    正常定义的ToolBar在最上方,这时候需要一个参照物,利用的是app:layout_anchor 这个属性来定位ToolBar的位置,而这个参照物就是FrameLayout

    效果图中 NestedScrollView 叠加上部一段距离,用app:behavior_overlapTop这个属性来实现。

    整个效果图只有PgOne再动,那么自定义Behavior中,依赖方就是这个TextView,那么依赖谁呢? 当让是滑动的ToolBar,使用自定义Behavior 用app:layout_behavior 这个属性。

    自定义Behavior

      @SuppressWarnings("unused")
    public class View1Behavior extends CoordinatorLayout.Behavior<TextView>{
    
    //自定义Behavior 一定要复写两个参数的构造方法
    public View1Behavior(Context context, AttributeSet attrs) {
        super(context, attrs);
    }
    
    //如果依赖的是 toolbar 才去处理
    @Override
    public boolean layoutDependsOn(CoordinatorLayout parent, TextView child, View dependency) {
        return dependency instanceof Toolbar;
    }
    
    private float startX ;
    private float startY ;
    private float stubX = 10 ; //矫正像素
    
    //这个方法主要是根据被依赖控件的位置,来改变依赖控件的时时滑动位置
    @Override
    public boolean onDependentViewChanged(CoordinatorLayout parent, TextView child, View dependency) {
        if (startX == 0) {
            startX = child.getX();
        }
    
        if (startY == 0) {
            startY = dependency.getY();
        }
        child.setY(dependency.getY());
    
        float persent = dependency.getY() / startY;
        dependency.setAlpha( 1 - persent);
        float x = startX - ((dependency.getWidth() - child.getWidth()) * (1 -persent)) + child.getWidth()/2 - stubX;
        child.setX(x);
        return true;
    }
    }
    

    dependency 被依赖方 这里指的是ToolBar

    child 依赖方 这里指的是TextView

    可以加群 136705426 跟着谷歌混饭吃

    相关文章

      网友评论

        本文标题:Android自定义Behavior(1)-给你想要的PgOne

        本文链接:https://www.haomeiwen.com/subject/slnkdxtx.html