至于這個具體的用法和原理 相信已經(jīng)有很多的資料可以參考了柱锹,想要再看一眼復(fù)習(xí)下的可以看下http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/1103/3650.html
自認為這個寫的還是挺簡單易懂的。
這里我想說是的是:
1.如果CoordinatorLayout里面有A View和B View吠谢。如果我們只給A View設(shè)置了SwipeDismissBehavior醉箕。當(dāng)我們觸摸B View的時候B View也會有滑動消失的效果胯杭。因為在ViewDragHelper的Callback的tryCaptureView所有的View都是返回的ture檐薯。
2.由于Behavior是CoordinatorLayout特有的材原,保存在CoordinatorLayout.LayoutParams中练俐,所以要通過這種方式實現(xiàn)側(cè)滑刪除袖迎,只能用CoordinatorLayout做布局,且需要刪除的view為CoordinatorLayout的第一級子View。
下面是自己寫的一個簡單的demo:
第一步:xml 布局文件activity_swipe_dismiss_behavior.xml
<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/coordinatorLayout"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/tv_swip"
android:layout_width="match_parent"
android:layout_height="200dp"
android:background="#ff00f0"
android:gravity="center"
android:text="別刪我"
android:textSize="20dp" />
<TextView
android:id="@+id/tv_below"
android:layout_width="match_parent"
android:layout_height="300dp"
android:background="#fff000"
android:layout_marginTop="20dp"
android:gravity="center"
android:text="我是我"
android:textSize="20dp"
android:layout_gravity="bottom" />
</android.support.design.widget.CoordinatorLayout>
第二步:SwipeDismissBehaviorActivity.class
public class SwipeDismissBehaviorActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_swipe_dismiss_behavior);
TextView swipeView = findViewById(R.id.tv_swip);
final TextView belowView = findViewById(R.id.tv_below);
SwipeDismissBehavior<View> swipeBehavior = new SwipeDismissBehavior();
swipeBehavior.setSwipeDirection(SwipeDismissBehavior.SWIPE_DIRECTION_ANY);
swipeBehavior.setListener(new SwipeDismissBehavior.OnDismissListener() {
@Override
public void onDismiss(View view) {
Toast.makeText(SwipeDismissBehaviorActivity.this, "I have dismiss", Toast.LENGTH_SHORT).show();
}
@Override
public void onDragStateChanged(int i) {
}
});
CoordinatorLayout.LayoutParams layoutParams = (CoordinatorLayout.LayoutParams) swipeView.getLayoutParams();
layoutParams.setBehavior(swipeBehavior);
}
}
ok ,就這么簡單燕锥,有人說不想在代碼中設(shè)置behavior辜贵,想直接在xml文件中設(shè)置behavior,也行啊归形,有個屬性叫app:layout_behavior 設(shè)置就好托慨,不過這邊也有一個坑 ,你可能覺得寫成下面這樣就行
app:layout_behavior="android.support.design.widget.SwipeDismissBehavior"
結(jié)果運行發(fā)現(xiàn)不可以暇榴,報錯啦厚棵,為啥呢?
- Behavior就是保存在CoordinatorLayout內(nèi)部的LayoutParams中的蔼紧;
2.繼續(xù)看LayoutParams婆硬,在LayoutParams的構(gòu)造方法中,通過反射創(chuàng)建了Behavior奸例;
3.利用反射機制去實例化了Behavior彬犯,調(diào)用的是兩個參數(shù)的那個構(gòu)造方法,但是去SwipeDismissBehavior源碼中沒有找到這個構(gòu)造方法哩至,這樣的話只能通過Java代碼的方式設(shè)置了躏嚎。這也就是我們在自定義Behavior的時候為什么一定要去重寫。
于是自定義了一個Behavior繼承自SwipeDismissBehavior菩貌。添加了一個相應(yīng)的構(gòu)造方法便于在xml inflate的時候反射調(diào)用。結(jié)果可以就可以了重荠。
public class MySwipeDismissBehavior extends SwipeDismissBehavior {
public MySwipeDismissBehavior(Context context, AttributeSet attrs) {
}
}
剩下你就可以愉快的寫在xml文件箭阶,只要behavior引用自定義的這個MySwipeDismissBehavior就好了。