Android 中CoordinatorLayout+AppBarLayout实现滚动头部悬停效果

 

效果图参考:https://blog.csdn.net/qq_42483967/article/details/81479106

 

我代码的效果图:

Android 中CoordinatorLayout+AppBarLayout实现滚动头部悬停效果_第1张图片      Android 中CoordinatorLayout+AppBarLayout实现滚动头部悬停效果_第2张图片

 

步骤如下:

 1.在app的buid.gradle中添加入AppBarLayout的依赖

 implementation 'com.android.support:design:28.0.0'

   Android 中CoordinatorLayout+AppBarLayout实现滚动头部悬停效果_第3张图片

2.activity_main.xml布局




    

       

        
        
        
        
        
    



    

AppBarLayout必须放在CoordinatorLayout中使用,

scaleType作用:Scaletype决定了图片在View上显示时的样子,如进行何种比例的缩放,及显示图片的整体还是部分,等等。
        不会使用这个参数的可以参考:https://blog.csdn.net/larryl2003/article/details/6919513
app:layout_collapseMode作用:AppBarLayout通过设置layout_scrollFlags参数,来控制AppBarLayout中控件的行为。
         不会使用这个参数的可以参考:https://blog.csdn.net/LosingCarryJie/article/details/78917423
app:elevation=”0dp”作用:参考https://blog.csdn.net/dreamsever/article/details/52672739
app:layout_behavior="@string/appbar_scrolling_view_behavior":显示在AppBarLayout下边

3.自定义 MyViewGroup

import android.content.Context;
import android.util.AttributeSet;
import android.view.GestureDetector;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Scroller;

public class MyViewGroup extends ViewGroup {
    private Context context;
    private Scroller myScroller;
    private GestureDetector detector;
    private int fristX;
    private boolean isFling;
    private int currId;
    private MyPageChangedListener pageChangedListener;

    public MyViewGroup(Context context, AttributeSet attrs) {
        super(context, attrs);

        this.context=context;
        init();
    }

    private void init() {
         myScroller=new Scroller(context);

    }
    //设置子view的位置
    @Override
    protected void onLayout(boolean changed, int l, int t, int r, int b) {
      for(int i=0;i=0)?nextId:0;
        currId=(nextId<=getChildCount())?nextId:(getChildCount());
        //触发listener事件
        if(pageChangedListener!=null){
            pageChangedListener.moveToDest(currId);
        }

        int distance = currId*getWidth() - getScrollX(); // 最终的位置 - 现在的位置  = 要移动的距离

        //设置运行的时间
        myScroller.startScroll(getScrollX(),0,distance,0, Math.abs(distance));
        /*
         * 刷新当前view   onDraw()方法 的执行
         */
        invalidate();
    }

    //invalidate();  会导致  computeScroll()这个方法的执行
    @Override
    public void computeScroll() {
        if(myScroller.computeScrollOffset()){
            int newX = (int) myScroller.getCurrX();

            scrollTo(newX, 0);

            invalidate();
        };
    }
    public interface MyPageChangedListener{
        void moveToDest(int currid);
    }

    public void setPageChangedListener(MyPageChangedListener pageChangedListener){
        this.pageChangedListener = pageChangedListener;

    }

    public MyPageChangedListener getPageChangedListener() {
        return pageChangedListener;
    }
}

4.最后MainActivity

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.RadioGroup;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

    private TextView tv;
    private StringBuilder tv_string;
    private MyViewGroup myscroll_view;
    private View[] views;
    private RadioGroup radioGroup;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //加载MyViewGroup所需要的子自布局
        views=new View[]{getLayoutInflater().inflate(R.layout.layout_one,null),getLayoutInflater().inflate(R.layout.layout_tow,null)};


        myscroll_view=(MyViewGroup)findViewById(R.id.myscroll_view);
        //给MyViewGroup添加上子布局
        for(int i=0;i

 

百度网盘源码下载:

https://pan.baidu.com/s/1HdY_TB2kMD_-NKqpd7vB5w

密码:yy2l

你可能感兴趣的:(android)