1. 程式人生 > >Android學習筆記(八)--CoordinatorLayout的應用-仿支付寶介面

Android學習筆記(八)--CoordinatorLayout的應用-仿支付寶介面

哈哈,差不多有一個禮拜沒有更新,去廣東那邊旅遊了四五天所以就沒有更新,接下來就要恢復正常了,又要開始學習了。今天帶來的是關於CoordinatorLayout的應用,模仿著支付寶做了一個介面,先看一下效果圖吧。
這裡寫圖片描述
實現了和支付寶一樣的上滑收縮和變化的功能。核心使用的就是今天要說的coordinatorLayout。CoordinatorLayout作為“super-powered FrameLayout”基本實現兩個功能:
1、作為頂層佈局
2、排程協調子佈局
就我的大白話來說就是協調子View之間動作的一個父View,通過Behavior來給子view實現互動的。
另外使用CoordinatorLayout需要在Gradle加入Support Design Library

compile 'com.android.support:design:24.2.1'

然後先看一下主佈局。

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent" android:layout_height="match_parent" android:fitsSystemWindows="true" tools:context="com.sp.coordinatortry.MainActivity"> <android.support.design.widget.AppBarLayout android:id="@+id/app_bar" android:layout_width="match_parent"
android:layout_height="wrap_content" android:fitsSystemWindows="true" android:theme="@style/AppTheme.AppBarOverlay"> <android.support.design.widget.CollapsingToolbarLayout android:layout_width="match_parent" android:layout_height="match_parent" android:fitsSystemWindows="true" app:contentScrim="@color/color1984D1" app:layout_scrollFlags="scroll|exitUntilCollapsed|snap" app:title=" "> <include layout="@layout/shenghuo_head1" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="100dp" android:layout_marginBottom="25dp" app:layout_collapseMode="parallax" app:layout_collapseParallaxMultiplier="0.8"/> <android.support.v7.widget.Toolbar android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" app:contentInsetLeft="0dp" app:layout_collapseMode="pin"> <include android:id="@+id/toolbar1" layout="@layout/toolbar_head1" android:layout_width="match_parent" android:layout_height="match_parent"/> <include android:id="@+id/toolbar2" layout="@layout/toolbar_head2" android:layout_width="match_parent" android:layout_height="match_parent" android:visibility="gone"/> </android.support.v7.widget.Toolbar> </android.support.design.widget.CollapsingToolbarLayout> </android.support.design.widget.AppBarLayout> <include layout="@layout/content_scrolling"/> </android.support.design.widget.CoordinatorLayout>

shenghuo_head1和head2分別是如下這裡寫圖片描述
這裡寫圖片描述
就不放具體程式碼了,可以自己自由的來實現,也不用非要拘泥於支付寶的樣子。
然後是toolbar_head1和head2.分別是拖拉前後的樣子。
這裡寫圖片描述這裡寫圖片描述
然後content_scrolling就是一個簡單的recyclerView,itemlayout則是一個CardView嵌套了一個TextView。
先放一下這個RecyclerView的Adapter。

package com.sp.coordinatortry;

import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

/**
 * Created by Jack on 2016/9/16.
 */

public class ToolbarAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>{

    private Context context;

    public ToolbarAdapter(Context context){
        this.context=context;
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        if(viewType==0){
           return new ItemView(LayoutInflater.from(context).inflate(R.layout.shenghuo_head2,null));
        }else{
           return new ItemView(LayoutInflater.from(context).inflate(R.layout.layout_item,parent,false));
        }
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {

    }

    @Override
    public int getItemCount() {
        return 50;
    }

    @Override
    public int getItemViewType(int position) {
        if(position==0){
            return 0;
        }else{
            return 1;
        }
    }

    class ItemView extends RecyclerView.ViewHolder{
        public ItemView(View itemView) {
            super(itemView);
        }
    }

}

都很清晰簡單,也不多說了。整個實現過程中最關鍵的就是在activity中的實現。先來介紹一下OnOffsetChangedListener。這個方法在AppBarLayout的佈局偏移量發生改變時被呼叫。這個方法允許子view根據偏移量實現自定義的行為(比如在特定的時候更改View)。

      mAppBarLayout.addOnOffsetChangedListener(new AppBarLayout.OnOffsetChangedListener() {
            @Override
            public void onOffsetChanged(AppBarLayout appBarLayout, int verticalOffset) {
                if (verticalOffset == 0){
                    //張開
                    mToolbar1.setVisibility(View.VISIBLE);
                    mToolbar2.setVisibility(View.GONE);
                    setToolbar1Alpha(255);
                } else if (Math.abs(verticalOffset) >= appBarLayout.getTotalScrollRange()) {
                    //收縮
                    mToolbar1.setVisibility(View.GONE);
                    mToolbar2.setVisibility(View.VISIBLE);
                    setToolbar2Alpha(255);
                } else {
                    int alpha=255-Math.abs(verticalOffset)-150;
                    if(alpha<=0){
                        //收縮toolbar
                        mToolbar1.setVisibility(View.GONE);
                        mToolbar2.setVisibility(View.VISIBLE);
                        setToolbar2Alpha(Math.abs(verticalOffset));
                    }else{
                        //張開toolbar
                        mToolbar1.setVisibility(View.VISIBLE);
                        mToolbar2.setVisibility(View.GONE);
                        setToolbar1Alpha(alpha);
                    }
                }
            }
        });

該activity中的應用如上。核心就設定AppBarLayout 的監聽器addOnOffsetChangedListener來進行效果的處理。當verticalOffset=0的時候即使整個展開的是時候要做的就是顯示要顯示的,隱藏要隱藏的設定,在設定透明度,同理當verticalOffset等於appBarLayout.getTotalScrollRange()即等於最大值的時候,就是關閉的時候,處理的展開相反。當他在中間值的時候,通過`int alpha=255-Math.abs(verticalOffset);得到要設定的透明度。當alpha小於0的時候是執行展開的toolbar的透明度效果,反之大於0的時候是閉合時toolbar的透明圖效果。
然後看一下完整的程式碼。

package com.sp.coordinatortry;

import android.graphics.Color;
import android.support.design.widget.AppBarLayout;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

    private AppBarLayout mAppBarLayout=null;
    private View mToolbar1=null;
    private View mToolbar2=null;

    private ImageView mZhangdan=null;
    private TextView mZhangdan_txt=null;
    private ImageView mTongxunlu=null;
    private ImageView mJiahao=null;

    private ImageView mZhangdan2=null;
    private ImageView mShaoyishao=null;
    private ImageView mSearch=null;
    private ImageView mZhaoxiang=null;

    private RecyclerView myRecyclerView;

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

        myRecyclerView=(RecyclerView)findViewById(R.id.myRecyclerView);
        myRecyclerView.setLayoutManager(new LinearLayoutManager(this));
        myRecyclerView.setAdapter(new ToolbarAdapter(this));

        mAppBarLayout=(AppBarLayout)findViewById(R.id.app_bar);
        mToolbar1=(View)findViewById(R.id.toolbar1);
        mToolbar2=(View)findViewById(R.id.toolbar2);
        mZhangdan=(ImageView)findViewById(R.id.img_zhangdan);
        mZhangdan_txt=(TextView)findViewById(R.id.img_zhangdan_txt);
        mTongxunlu=(ImageView)findViewById(R.id.tongxunlu);
        mJiahao=(ImageView)findViewById(R.id.jiahao);
        mZhangdan2=(ImageView)findViewById(R.id.img_shaomiao);
        mShaoyishao=(ImageView)findViewById(R.id.img_fukuang);
        mSearch=(ImageView)findViewById(R.id.img_search);
        mZhaoxiang=(ImageView)findViewById(R.id.img_zhaoxiang);

        mAppBarLayout.addOnOffsetChangedListener(new AppBarLayout.OnOffsetChangedListener() {
            @Override
            public void onOffsetChanged(AppBarLayout appBarLayout, int verticalOffset) {
                if (verticalOffset == 0){
                    //張開
                    mToolbar1.setVisibility(View.VISIBLE);
                    mToolbar2.setVisibility(View.GONE);
                    setToolbar1Alpha(255);
                } else if (Math.abs(verticalOffset) >= appBarLayout.getTotalScrollRange()) {
                    //收縮
                    mToolbar1.setVisibility(View.GONE);
                    mToolbar2.setVisibility(View.VISIBLE);
                    setToolbar2Alpha(255);
                } else {
                    int alpha=255-Math.abs(verticalOffset);
                    if(alpha<=0){
                        //收縮toolbar
                        mToolbar1.setVisibility(View.GONE);
                        mToolbar2.setVisibility(View.VISIBLE);
                        setToolbar2Alpha(Math.abs(verticalOffset));
                    }else{
                        //張開toolbar
                        mToolbar1.setVisibility(View.VISIBLE);
                        mToolbar2.setVisibility(View.GONE);
                        setToolbar1Alpha(alpha);
                    }
                }
            }
        });
    }

    //設定展開時各控制元件的透明度
    public void setToolbar1Alpha(int alpha){
        mZhangdan.getDrawable().setAlpha(alpha);
        mZhangdan_txt.setTextColor(Color.argb(alpha, 255, 255, 255));
        mTongxunlu.getDrawable().setAlpha(alpha);
        mJiahao.getDrawable().setAlpha(alpha);
    }

    //設定閉合時各控制元件的透明度
    public void setToolbar2Alpha(int alpha){
        mZhangdan2.getDrawable().setAlpha(alpha);
        mShaoyishao.getDrawable().setAlpha(alpha);
        mSearch.getDrawable().setAlpha(alpha);
        mZhaoxiang.getDrawable().setAlpha(alpha);
    }

}

到此就基本實現了。上面程式碼參考了一些他人的部落格,導致自己對appbarlayout和CoordinatorLayout的應用還不是很深入,還要繼續學習啊。