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的應用還不是很深入,還要繼續學習啊。