<com.ycbjie.slide.SlideLayout
android:id="@+id/slideDetailsLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:default_panel="front"
app:duration="200"
app:percent="0.1">
<!--商品佈局-->
<FrameLayout
android:id="@+id/fl_shop_main"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<!--分頁詳情webView佈局-->
<include layout="@layout/include_shop_detail"/>
</com.ycbjie.slide.SlideLayout>
複製代碼
mSlideDetailsLayout.setOnSlideDetailsListener(new SlideLayout.OnSlideDetailsListener() {
@Override
public void onStatusChanged(SlideLayout.Status status) {
if (status == SlideLayout.Status.OPEN) {
//當前爲圖文詳情頁
Log.e("FirstActivity","下拉回到商品詳情");
} else {
//當前爲商品詳情頁
Log.e("FirstActivity","繼續上拉,查看圖文詳情");
}
}
});
//關閉商詳頁
mSlideDetailsLayout.smoothClose(true);
//打開詳情頁
mSlideDetailsLayout.smoothOpen(true);
複製代碼
<com.ycbjie.slide.SlideAnimLayout
android:id="@+id/slideDetailsLayout"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
app:default_panel="front"
app:duration="200"
app:percent="0.1">
<!--商品佈局-->
<FrameLayout
android:id="@+id/fl_shop_main2"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
<!--上拉加載動畫布局-->
<LinearLayout
android:id="@+id/ll_page_more"
android:orientation="vertical"
android:background="@color/colorAccent"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ImageView
android:id="@+id/iv_more_img"
android:layout_width="40dp"
android:layout_height="40dp"
android:rotation="180"
android:layout_gravity="center_horizontal"
android:src="@mipmap/icon_details_page_down_loading" />
<TextView
android:id="@+id/tv_more_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginBottom="25dp"
android:gravity="center"
android:text="測試動畫,繼續上拉,查看圖文詳情"
android:textSize="13sp" />
</LinearLayout>
<!--分頁詳情webView佈局-->
<include layout="@layout/include_shop_detail"/>
</com.ycbjie.slide.SlideAnimLayout>
複製代碼
mSlideDetailsLayout.setScrollStatusListener(new SlideAnimLayout.onScrollStatusListener() {
@Override
public void onStatusChanged(SlideAnimLayout.Status mNowStatus, boolean isHalf) {
if(mNowStatus== SlideAnimLayout.Status.CLOSE){
//打開
if(isHalf){
mTvMoreText.setText("釋放,查看圖文詳情");
mIvMoreImg.animate().rotation(0);
LoggerUtils.i("onStatusChanged---CLOSE---釋放"+isHalf);
}else{//關閉
mTvMoreText.setText("繼續上拉,查看圖文詳情");
mIvMoreImg.animate().rotation(180);
LoggerUtils.i("onStatusChanged---CLOSE---繼續上拉"+isHalf);
}
}else{
//打開
if(isHalf){
mTvMoreText.setText("下拉回到商品詳情");
mIvMoreImg.animate().rotation(0);
LoggerUtils.i("onStatusChanged---OPEN---下拉回到商品詳情"+isHalf);
}else{//關閉
mTvMoreText.setText("釋放回到商品詳情");
mIvMoreImg.animate().rotation(180);
LoggerUtils.i("onStatusChanged---OPEN---釋放回到商品詳情"+isHalf);
}
}
}
});
//關閉商詳頁
mSlideDetailsLayout.smoothClose(true);
//打開詳情頁
mSlideDetailsLayout.smoothOpen(true);
複製代碼
@Override
protected void onFinishInflate() {
super.onFinishInflate();
final int childCount = getChildCount();
if (1 >= childCount) {
throw new RuntimeException("SlideDetailsLayout only accept child more than 1!!");
}
mFrontView = getChildAt(0);
mBehindView = getChildAt(1);
if(mDefaultPanel == 1){
post(new Runnable() {
@Override
public void run() {
//默認是關閉狀態的
smoothOpen(false);
}
});
}
}
複製代碼
@Override
protected void onFinishInflate() {
super.onFinishInflate();
final int childCount = getChildCount();
if (1 >= childCount) {
throw new RuntimeException("SlideDetailsLayout only accept childs more than 1!!");
}
mFrontView = getChildAt(0);
mAnimView = getChildAt(1);
mBehindView = getChildAt(2);
mAnimView.post(new Runnable() {
@Override
public void run() {
animHeight = mAnimView.getHeight();
LoggerUtils.i("獲取控件高度"+animHeight);
}
});
if(mDefaultPanel == 1){
post(new Runnable() {
@Override
public void run() {
//默認是關閉狀態的
smoothOpen(false);
}
});
}
}
複製代碼
@Override
protected Parcelable onSaveInstanceState() {
SavedState ss = new SavedState(super.onSaveInstanceState());
ss.offset = mSlideOffset;
ss.status = mStatus.ordinal();
return ss;
}
@Override
protected void onRestoreInstanceState(Parcelable state) {
SavedState ss = (SavedState) state;
super.onRestoreInstanceState(ss.getSuperState());
mSlideOffset = ss.offset;
mStatus = Status.valueOf(ss.status);
if (mStatus == Status.OPEN) {
mBehindView.setVisibility(VISIBLE);
}
requestLayout();
}
複製代碼
@Override
protected void onDetachedFromWindow() {
super.onDetachedFromWindow();
setScrollStatusListener(null);
setOnSlideStatusListener(null);
if (animator!=null){
animator.cancel();
animator = null;
}
}
複製代碼
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
downX = ev.getX();
downY = ev.getY();
//若是滑動到了最底部,就容許繼續向上滑動加載下一頁,否者不容許
//若是子節點不但願父進程攔截觸摸事件,則爲true。
getParent().requestDisallowInterceptTouchEvent(true);
break;
case MotionEvent.ACTION_MOVE:
float dx = ev.getX() - downX;
float dy = ev.getY() - downY;
boolean allowParentTouchEvent;
if (Math.abs(dy) > Math.abs(dx)) {
if (dy > 0) {
//位於頂部時下拉,讓父View消費事件
allowParentTouchEvent = isTop();
} else {
//位於底部時上拉,讓父View消費事件
allowParentTouchEvent = isBottom();
}
} else {
//水平方向滑動
allowParentTouchEvent = true;
}
getParent().requestDisallowInterceptTouchEvent(!allowParentTouchEvent);
break;
default:
break;
}
return super.dispatchTouchEvent(ev);
}
複製代碼