一、为什么要自定义下拉刷新效果
下拉刷新是Android中常见的UI设计,一般使用SwipeRefreshLayout或下拉刷新开源库,但这些库提供的效果可能无法满足一些特殊的需求。比如,我们想要在下拉刷新时加入自己的加载动画或下拉头部,这时就需要自定义下拉刷新效果。
那么,在让我们看看如何实现自定义下拉刷新效果。
二、实现自定义下拉刷新效果
1.自定义下拉头部
自定义下拉头部是实现自定义下拉刷新的第一步。我们可以使用一个自定义布局来替代系统原有的下拉头部。
//在下拉刷新的布局中添加自定义下拉头部
<com.example.myapp.CustomRefreshLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
app:header_layout="@layout/custom_header_layout">
<ListView
android:id="@+id/list_view"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</com.example.myapp.CustomRefreshLayout>
在CustomRefreshLayout布局中添加自定义的header_layout。
接着,我们来看看如何实现自定义下拉头部的效果。
public class CustomRefreshLayout extends SwipeRefreshLayout {
private View headerView;
private ImageView ivRefresh;
private AnimationDrawable mAnim;
public CustomRefreshLayout(Context context) {
super(context);
initView(context);
}
public CustomRefreshLayout(Context context, AttributeSet attrs) {
super(context, attrs);
initView(context);
}
private void initView(Context context) {
headerView = LayoutInflater.from(context).inflate(R.layout.custom_header_layout, null);
ivRefresh = (ImageView) headerView.findViewById(R.id.iv_refresh);
mAnim = (AnimationDrawable) ivRefresh.getDrawable();
setProgressViewOffset(false, 0, 150); //调整刷新进度条的位置
addView(headerView); //添加自定义下拉头部
}
/**
* 下拉刷新过程
*/
@Override
public void onProgressChanged(int progress, boolean fromUser) {
super.onProgressChanged(progress, fromUser);
if (progress == 0) {
mAnim.stop();
} else if (!mAnim.isRunning()) {
mAnim.start();
}
}
/**
* 停止下拉刷新
*/
@Override
public void setRefreshing(boolean refreshing) {
super.setRefreshing(refreshing);
if (!refreshing) {
mAnim.stop();
}
}
}
在CustomRefreshLayout中实现自定义下拉头部的动画效果。
2.自定义下拉加载动画
为了满足特殊的加载需求,我们可以自定义下拉加载动画。
public class CustomRefreshLayout extends SwipeRefreshLayout {
...
private View footerView;
private ImageView ivLoading;
...
public CustomRefreshLayout(Context context) {
super(context);
initView(context);
}
public CustomRefreshLayout(Context context, AttributeSet attrs) {
super(context, attrs);
initView(context);
}
private void initView(Context context) {
......
footerView = LayoutInflater.from(context).inflate(R.layout.custom_footer_layout, null);
ivLoading = (ImageView) footerView.findViewById(R.id.iv_loading);
mAnim = (AnimationDrawable) ivLoading.getDrawable();
addView(footerView); //添加自定义下拉加载
}
/**
* 加载完成后关闭加载动画
*/
public void onLoadComplete() {
setRefreshing(false);
footerView.setVisibility(GONE);
mAnim.stop();
}
}
在CustomRefreshLayout中实现自定义下拉加载效果并在加载完成后关闭加载动画。
3.触发自定义下拉刷新
完成自定义下拉头部和自定义下拉加载动画后,还需要一个手势触发的方法。
listView.setOnTouchListener(new OnTouchListener() {
private float startY;
private float deltaX;
private boolean isHeaderVisible = false;
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
startY = event.getY();
break;
case MotionEvent.ACTION_MOVE:
if (isHeaderVisible) {
deltaY = (event.getY() - startY) * RESISTANCE_FACTOR;
setHeaderHeight(deltaY);
return true;
}
case MotionEvent.ACTION_UP:
if (isHeaderVisible) {
//触发刷新
if (headerHeight >= headerViewHeight) {
if (mOnRefreshListener != null) {
mOnRefreshListener.onRefresh();
}
} else {
//恢复原始状态
resetHeaderHeight();
}
return true;
}
break;
}
return false;
}
});
通过监听ListView的onTouch事件,来手动触发自定义下拉刷新效果。
三、总结
通过自定义下拉头部和自定义下拉加载动画,我们可以更快速更灵活地实现自己想要的下拉刷新效果,让我们的应用在界面上更加与众不同。
原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/243328.html
微信扫一扫
支付宝扫一扫