SwipeRefreshLayout是一個Google官方提供的下拉刷新控件,通過下拉刷新可以及時更新數據,提高用戶體驗。它主要有兩個特點:
- 支持多種樣式的下拉刷新
- 支持多種手勢操作:下拉刷新、上拉加載更多、左滑、右滑
一、基本用法
1、首先在build.gradle中引入SwipeRefreshLayout庫:
dependencies {
implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.1.0'
}
2、在布局文件中添加SwipeRefreshLayout控件,注意SwipeRefreshLayout只能有一個子控件:
<androidx.swiperefreshlayout.widget.SwipeRefreshLayout
android:id="@+id/swipe_refresh_layout"
android:layout_width="match_parent"
android:layout_height="match_parent">
<RecyclerView
android:id="@+id/recycler_view"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</androidx.swiperefreshlayout.widget.SwipeRefreshLayout>
3、在Java代碼中獲取SwipeRefreshLayout控件,並設置刷新監聽器:
SwipeRefreshLayout swipeRefreshLayout = findViewById(R.id.swipe_refresh_layout);
swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
//下拉刷新操作
}
});
4、在下拉刷新操作完成後,記得調用SwipeRefreshLayout的setRefreshing(false)方法,取消刷新狀態:
swipeRefreshLayout.setRefreshing(false);
二、自定義樣式
SwipeRefreshLayout提供了兩種樣式的刷新效果:傳統樣式和Material Design樣式。我們可以通過setProgressBackgroundColorSchemeResource()和setColorSchemeResources()方法來改變刷新樣式,也可以自定義實現更加炫酷的自己的刷新樣式。
1、傳統樣式刷新:
swipeRefreshLayout.setProgressBackgroundColorSchemeResource(android.R.color.white);
swipeRefreshLayout.setColorSchemeResources(android.R.color.holo_blue_bright,
android.R.color.holo_green_light,
android.R.color.holo_orange_light,
android.R.color.holo_red_light);
2、Material Design樣式刷新:
swipeRefreshLayout.setProgressBackgroundColorSchemeResource(android.R.color.white);
swipeRefreshLayout.setColorSchemeResources(R.color.colorAccent);
3、自定義樣式刷新:
swipeRefreshLayout.setProgressBackgroundColorSchemeResource(R.color.colorPrimary);
swipeRefreshLayout.setColorSchemeResources(R.color.colorAccent);
swipeRefreshLayout.setProgressViewOffset(true, -100, 300);
//設置刷新視圖
CustomRefreshView customRefreshView = new CustomRefreshView(context);
swipeRefreshLayout.addView(customRefreshView, ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT);
class CustomRefreshView extends View implements SwipeRefreshLayout.OnChildScrollUpCallback {
Paint mPaint;
int mOffsetTop = 0;
public CustomRefreshView(Context context) {
super(context);
mPaint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.DITHER_FLAG);
mPaint.setColor(Color.BLUE);
mPaint.setStyle(Paint.Style.FILL);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawRect(0, 0 + mOffsetTop, getWidth(), getHeight() + mOffsetTop, mPaint);
}
//OnChildScrollUpCallback回調方法,返回值決定是否可以下拉刷新
@Override
public boolean canChildScrollUp(SwipeRefreshLayout parent, @Nullable View child) {
return false;
}
public void setOffsetTop(int offsetTop) {
mOffsetTop = offsetTop;
invalidate();
}
}
//刷新操作完成後調用,注意中間需要延時,確保CustomRefreshView滑動到頂部
ObjectAnimator animator = ObjectAnimator.ofInt(customRefreshView, "offsetTop", customRefreshView.mOffsetTop, 0);
animator.setDuration(300);
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
swipeRefreshLayout.setRefreshing(false);
animator.start();
}
}, 1000);
三、手勢操作
SwipeRefreshLayout除了支持下拉刷新外,還支持了上拉加載更多和左右滑動手勢,我們可以通過setOnTouchListener()方法來監聽觸摸事件,並根據手勢來進行邏輯處理。
1、上拉加載更多:
final LinearLayoutManager layoutManager = new LinearLayoutManager(this);
recyclerView.setLayoutManager(layoutManager);
recyclerView.setOnTouchListener(new OnSwipeTouchListener(this){
@Override
public void onBottom() {
//上拉加載更多操作
}
});
abstract class OnSwipeTouchListener implements OnTouchListener {
private GestureDetector gestureDetector;
public OnSwipeTouchListener(Context context) {
gestureDetector = new GestureDetector(context, new GestureListener());
}
public void onLeftSwipe() {
}
public void onRightSwipe() {
}
public void onTop() {
}
public void onBottom() {
}
public boolean onTouch(View v, MotionEvent event) {
return gestureDetector.onTouchEvent(event);
}
private final class GestureListener extends GestureDetector.SimpleOnGestureListener {
private static final int SWIPE_THRESHOLD = 100;
private static final int SWIPE_VELOCITY_THRESHOLD = 100;
@Override
public boolean onDown(MotionEvent e) {
return true;
}
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
boolean result = false;
try {
float diffY = e2.getY() - e1.getY();
float diffX = e2.getX() - e1.getX();
if (Math.abs(diffX) > Math.abs(diffY)) {
if (Math.abs(diffX) > SWIPE_THRESHOLD && Math.abs(velocityX) > SWIPE_VELOCITY_THRESHOLD) {
if (diffX > 0) {
onRightSwipe();
} else {
onLeftSwipe();
}
result = true;
}
} else {
if (Math.abs(diffY) > SWIPE_THRESHOLD && Math.abs(velocityY) > SWIPE_VELOCITY_THRESHOLD) {
if (diffY < 0) {
onTop();
} else {
onBottom();
}
result = true;
}
}
} catch (Exception exception) {
exception.printStackTrace();
}
return result;
}
}
}
2、左右滑動:
recyclerView.setOnTouchListener(new OnSwipeTouchListener(this){
@Override
public void onLeftSwipe() {
//左滑操作
}
@Override
public void onRightSwipe() {
//右滑操作
}
});
四、小結
通過本文,我們詳細了解了SwipeRefreshLayout的基本用法、顏色樣式以及手勢操作。SwipeRefreshLayout作為Android平台上常用的下拉刷新控件,具有良好的用戶交互體驗,對於提升應用質量具有重要意義。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/303687.html