在前面的Design中,學習使用了TabLayout,NavigationView與DrawerLayout實現的神奇效果,今天就帶來本次Design包中我認為最有意義的控件CoordinatorLayout。
當然還有SnackBar,不過他在實際運用中一般都是和CoordinatorLayout搭配使用的。
先說下SnackBar,這個控件其實我覺得和Toast沒什么差別,不過功能上的確有增強。這個控件可以通過setAction方法設置類似按鈕一樣的東西。而且這個東西可以設置多個。
重點還是我們的CoordinatorLayout控件,這是一個增強型的FrameLayout,功能非常強大,可以給它的子布局增加很多有意思的東西。
它通常和Behavior聯合在一起使用。
項目已同步至github:https://github.com/nanchen2251/CoordinatorLayout(包括了下一節內容的源代碼)
先上一波運行圖:

可以在Behavior中通過監聽Scoll來實現控件的顯示和隱藏
package com.example.nanchen.designcoodinatordemo;
import android.content.Context;
import android.support.design.widget.CoordinatorLayout;
import android.support.v4.view.ViewCompat;
import android.util.AttributeSet;
import android.view.View;
/**
* 自定義Behavior
* Created by 南塵 on 16-7-14.
*/
public class MyBehavior extends CoordinatorLayout.Behavior {
//寫了這個構造方法才能在XML文件中直接指定
public MyBehavior(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
public boolean onStartNestedScroll(CoordinatorLayout coordinatorLayout, View child, View directTargetChild, View target, int nestedScrollAxes) {
return true;//返回true代表我們關心這個滾動事件
}
@Override
public void onNestedPreScroll(CoordinatorLayout coordinatorLayout, View child, View target, int dx, int dy, int[] consumed) {
super.onNestedPreScroll(coordinatorLayout, child, target, dx, dy, consumed);
if (dy < 0) {//向下滾動
ViewCompat.animate(child).scaleX(1).alpha(1).start();
} else {//向上滾動
ViewCompat.animate(child).scaleX(0).alpha(0).start();
}
}
}
這樣在下拉的時候就會消失。

值得注意的是,若是想在XML中顯示指定Behavior的話,必須重寫構造方法
public MyBehavior(Context context, AttributeSet attrs) {
super(context, attrs);
}
其他的一些代碼
package com.example.nanchen.designcoodinatordemo;
import android.os.Bundle;
import android.support.design.widget.Snackbar;
import android.support.design.widget.SwipeDismissBehavior;
import android.support.v4.view.ViewCompat;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.widget.TextView;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
public class MainActivity extends AppCompatActivity implements SwipeDismissBehavior.OnDismissListener {
private TextView tv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv = (TextView) findViewById(R.id.main_tv);
RecyclerView recyclerView = (RecyclerView) findViewById(R.id.main_recycler);
List<String> list = new ArrayList<>();
for (int i = 0; i < 100; i++) {
list.add(String.format(Locale.CHINA,"第%03d行",i));
}
MyAdapter adapter = new MyAdapter(list,this);
recyclerView.setAdapter(adapter);
// CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) tv.getLayoutParams();
// SwipeDismissBehavior<TextView> behavior = new SwipeDismissBehavior<>();
// behavior.setListener(this);//設置一個監聽
// params.setBehavior(behavior);//設置一個行為
// MyBehavior behavior = new MyBehavior();
// params.setBehavior(behavior);
}
@Override
public void onDismiss(View view) {
view.setVisibility(View.GONE);
Snackbar.make(view,"刪除了一個控件!",Snackbar.LENGTH_SHORT)
.setAction("撤銷", new View.OnClickListener() {
@Override
public void onClick(View v) {
tv.setVisibility(View.VISIBLE);
ViewCompat.animate(tv).alpha(1).start();//把透明度設置為1
}
}).show();
}
@Override
public void onDragStateChanged(int state) {
}
}
package com.example.nanchen.designcoodinatordemo;
import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.ViewGroup;
import android.widget.TextView;
import java.util.List;
/**
* Created by 南塵 on 16-7-14.
*/
public class MyAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private List<String> list;
private Context context;
public MyAdapter(List<String> list, Context context) {
this.list = list;
this.context = context;
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
TextView textView = new TextView(context);
return new RecyclerView.ViewHolder(textView) {};
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
((TextView) holder.itemView).setText(list.get(position));
}
@Override
public int getItemCount() {
return list.size();
}
}
<?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"
tools:context="com.example.nanchen.designcoodinatordemo.MainActivity">
<android.support.v7.widget.RecyclerView
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layoutManager="LinearLayoutManager"
android:id="@+id/main_recycler"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="30sp"
android:background="#f00"
android:clickable="true"
android:layout_gravity="center"
android:id="@+id/main_tv"
app:layout_behavior="com.example.nanchen.designcoodinatordemo.MyBehavior"
android:text="Hello World!"/>
</android.support.design.widget.CoordinatorLayout>
