一、为什么要自定义下拉刷新效果
下拉刷新是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事件,来手动触发自定义下拉刷新效果。
三、总结
通过自定义下拉头部和自定义下拉加载动画,我们可以更快速更灵活地实现自己想要的下拉刷新效果,让我们的应用在界面上更加与众不同。