吸顶&滑动不卡顿&刷新&状态栏CoordinatorLayout
2020-09-24 本文已影响0人
hao_developer
image.png
使用第三方:
刷新:
implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0'
状态栏:StatusBarHeightView
AppBarLayout得behavior(CustomBehavior)
import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.widget.OverScroller;
import androidx.coordinatorlayout.widget.CoordinatorLayout;
import com.google.android.material.appbar.AppBarLayout;
import java.lang.reflect.Field;
/**
*
* @describe 自定义behavior 以解决滑动抖动
*
*/
public class CustomBehavior extends AppBarLayout.Behavior {
private OverScroller mScroller;
public CustomBehavior() {
}
public CustomBehavior(Context context, AttributeSet attrs) {
super(context, attrs);
getParentScroller(context);
}
/**
* 反射获得滑动属性。
*
* @param context
*/
private void getParentScroller(Context context) {
if (mScroller != null) return;
mScroller = new OverScroller(context);
try {
Class<?> reflex_class = getClass().getSuperclass().getSuperclass();//父类AppBarLayout.Behavior 父类的父类 HeaderBehavior
Field fieldScroller = reflex_class.getDeclaredField("mScroller");
fieldScroller.setAccessible(true);
fieldScroller.set(this, mScroller);
} catch (Exception e) {}
}
//fling上滑appbar然后迅速fling下滑recycler时, HeaderBehavior的mScroller并未停止, 会导致上下来回晃动
@Override
public void onNestedPreScroll(CoordinatorLayout coordinatorLayout, AppBarLayout child, View target, int dx, int dy, int[] consumed, int type) {
if(mScroller!=null){ //当recyclerView 做好滑动准备的时候 直接干掉Appbar的滑动
if (mScroller.computeScrollOffset()) {
mScroller.abortAnimation();
}
}
super.onNestedPreScroll(coordinatorLayout, child, target, dx, dy, consumed, type);
}
@Override
public boolean onTouchEvent(CoordinatorLayout parent, AppBarLayout child, MotionEvent e) {
switch (e.getActionMasked()) {
case MotionEvent.ACTION_DOWN:
break;
}
return super.onTouchEvent(parent,child,e);
}
}
布局
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/white_fc">
<com.dsy.jxih.tools.status.StatusBarHeightView
android:id="@+id/status"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/zong_db"
app:use_type="use_padding_top" />
<LinearLayout
android:id="@+id/llTitle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/status"
android:background="@color/zong_db"
android:orientation="vertical"
android:paddingTop="@dimen/dp_7"
android:paddingBottom="@dimen/dp_7">
<TextView
android:id="@+id/tvSearch"
android:layout_width="match_parent"
android:layout_height="@dimen/dp_33"
android:layout_centerInParent="true"
android:layout_marginLeft="@dimen/dp_10"
android:layout_marginRight="@dimen/dp_10"
android:background="@drawable/hui_20_circle_white_shape_bg"
android:drawableRight="@mipmap/search_hui"
android:drawablePadding="@dimen/dp_5"
android:gravity="center"
android:paddingLeft="@dimen/dp_15"
android:paddingRight="@dimen/dp_15"
android:text="输入搜索关键词"
android:textColor="@color/hui_ffc"
android:textSize="@dimen/sp_14" />
</LinearLayout>
<com.scwang.smartrefresh.layout.SmartRefreshLayout
android:id="@+id/sRefresh"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@+id/llTitle"
android:background="@color/white_fc">
<com.dsy.jxih.view.MyHeaderView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/zong_db" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<androidx.coordinatorlayout.widget.CoordinatorLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.google.android.material.appbar.AppBarLayout
android:id="@+id/abLay"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:elevation="@dimen/dp_0"
app:layout_behavior=".view.CustomBehavior">
<com.google.android.material.appbar.CollapsingToolbarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/white_fc"
app:elevation="@dimen/dp_0"
app:expandedTitleGravity="center"
app:layout_scrollFlags="scroll|exitUntilCollapsed"
app:titleEnabled="false">
<View
android:id="@+id/bannerBgView"
android:layout_width="match_parent"
android:layout_height="@dimen/dp_70"
android:background="@color/zong_db" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<com.dsy.jxih.view.banner.MZBannerView
android:id="@+id/bannerView"
android:layout_width="match_parent"
android:layout_height="@dimen/dp_133"
android:layout_centerInParent="true"
android:layout_marginTop="@dimen/dp_7"
android:scaleType="centerCrop"
app:canLoop="true"
app:layout_constraintTop_toTopOf="parent"
app:open_mz_mode="true" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rvMenuList"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dp_12"
android:layout_marginBottom="@dimen/dp_16"
android:scrollbars="none" />
<LinearLayout
android:id="@+id/llGridLay"
android:layout_width="match_parent"
android:layout_height="@dimen/dp_150"
android:layout_marginLeft="@dimen/dp_10"
android:layout_marginRight="@dimen/dp_10"
android:layout_marginBottom="@dimen/dp_16"
android:orientation="horizontal">
<androidx.cardview.widget.CardView
android:layout_width="@dimen/dp_0"
android:layout_height="match_parent"
android:layout_marginRight="@dimen/dp_2_5"
android:layout_weight="1"
app:cardCornerRadius="@dimen/dp_5"
app:cardElevation="@dimen/dp_0">
<ImageView
android:id="@+id/ivLeft"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:adjustViewBounds="true"
android:scaleType="centerCrop"
android:src="@mipmap/ic_image_2" />
</androidx.cardview.widget.CardView>
<LinearLayout
android:layout_width="@dimen/dp_0"
android:layout_height="match_parent"
android:layout_marginLeft="@dimen/dp_2_5"
android:layout_weight="1"
android:orientation="vertical">
<androidx.cardview.widget.CardView
android:layout_width="match_parent"
android:layout_height="@dimen/dp_0"
android:layout_marginBottom="@dimen/dp_2_5"
android:layout_weight="1"
app:cardCornerRadius="@dimen/dp_5"
app:cardElevation="@dimen/dp_0">
<ImageView
android:id="@+id/ivTop"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scaleType="centerCrop"
android:src="@mipmap/ic_image_7" />
</androidx.cardview.widget.CardView>
<androidx.cardview.widget.CardView
android:layout_width="match_parent"
android:layout_height="@dimen/dp_0"
android:layout_marginTop="@dimen/dp_2_5"
android:layout_weight="1"
app:cardCornerRadius="@dimen/dp_5"
app:cardElevation="@dimen/dp_0">
<ImageView
android:id="@+id/ivBottom"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scaleType="centerCrop"
android:src="@mipmap/ic_image_7" />
</androidx.cardview.widget.CardView>
</LinearLayout>
</LinearLayout>
</LinearLayout>
</com.google.android.material.appbar.CollapsingToolbarLayout>
<com.google.android.material.tabs.TabLayout
android:id="@+id/tabLay"
android:layout_width="match_parent"
android:layout_height="@dimen/dp_35"
android:background="@color/white_fc"
android:elevation="@dimen/dp_0"
app:tabBackground="@android:color/transparent"
app:tabIndicator="@drawable/indicator"
app:tabIndicatorFullWidth="false"
app:tabMode="scrollable"
app:tabPadding="-1dp"
app:tabRippleColor="@android:color/transparent"
app:tabSelectedTextColor="@color/red_f3"
app:tabTextAppearance="@style/TabLayoutTextSize"
app:tabTextColor="@color/black_3" />
</com.google.android.material.appbar.AppBarLayout>
<androidx.core.widget.NestedScrollView
android:id="@+id/scroView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/white_fc"
android:paddingTop="@dimen/dp_10"
app:layout_anchorGravity="bottom"
app:layout_behavior="@string/appbar_scrolling_view_behavior">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rvList"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginLeft="@dimen/dp_5"
android:layout_marginRight="@dimen/dp_5"
android:nestedScrollingEnabled="false" />
</androidx.core.widget.NestedScrollView>
</androidx.coordinatorlayout.widget.CoordinatorLayout>
</LinearLayout>
<com.scwang.smartrefresh.layout.footer.ClassicsFooter
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/white_fc" />
</com.scwang.smartrefresh.layout.SmartRefreshLayout>
</RelativeLayout>