AutoHomeRefreshListView仿汽车之家下拉刷新

AutoHomeRefreshListView 高仿汽车之家下拉刷新 ,下拉的时候出现很不错的效果。
本项目来自:https://github.com/nugongshou110/AutoHomeRefreshListView
首先是自定义AutoHomeListView,继承ListView实现的
重要代码如下:

public class AutoHomeListView extends ListView implements AbsListView.OnScrollListener{
private static final int DONE = 0;
private static final int PULL_TO_REFRESH = 1;
private static final int RELEASE_TO_REFRESH = 2;
private static final int REFRESHING = 3;
private static final int RATIO = 4;
private LinearLayout headerView;
private AutoHome mAutoHome;
private int headerViewHeight;
private float startY;
private float currentProgress;
private int currentHeight;
private float offsetY;
private TextView tv_pull_to_refresh;
private OnAutoHomeRefreshListener mOnRefreshListener;
private int state;
private int mFirstVisibleItem;
private boolean isRecord;
private boolean isEnd;
private boolean isRefreable;
private FrameLayout mAnimContainer;
private PointerView mAutoHomeAnim;
private Animation animation;


public AutoHomeListView(Context context) {
super(context);
init(context);
}

public AutoHomeListView(Context context, AttributeSet attrs) {
super(context, attrs);
init(context);
}

public AutoHomeListView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init(context);
}

public interface OnAutoHomeRefreshListener{
void onRefresh();
}
public void setOnAutoHomeRefreshListener(OnAutoHomeRefreshListener onRefreshListener){
mOnRefreshListener = onRefreshListener;
isRefreable = true;
}
public void setOnRefreshComplete(){
isEnd = true;
state = DONE;
changeHeaderByState(state);
}

private void init(Context context) {
setOverScrollMode(View.OVER_SCROLL_NEVER);
setOnScrollListener(this);

headerView = (LinearLayout) LayoutInflater.from(context).inflate(R.layout.autohome_item, null, false);
mAutoHome = (AutoHome) headerView.findViewById(R.id.auto_home);
tv_pull_to_refresh = (TextView) headerView.findViewById(R.id.tv_pull_to_refresh);
mAnimContainer = (FrameLayout) headerView.findViewById(R.id.anim_container);
mAutoHomeAnim = (PointerView) headerView.findViewById(R.id.anim_pointer);

animation = AnimationUtils.loadAnimation(context, R.anim.pointer_rotate);

measureView(headerView);
addHeaderView(headerView);
headerViewHeight = headerView.getMeasuredHeight();
headerView.setPadding(0, -headerViewHeight, 0, 0);

state = DONE;
isEnd = true;
isRefreable = false;
}

@Override
public void onScrollStateChanged(AbsListView absListView, int i) {
}
@Override
public void onScroll(AbsListView absListView, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
mFirstVisibleItem = firstVisibleItem;
}

@Override
public boolean onTouchEvent(MotionEvent ev) {
if (isEnd) {
if (isRefreable) {
switch (ev.getAction()){
case MotionEvent.ACTION_DOWN:
if (mFirstVisibleItem == 0 && !isRecord) {
isRecord = true;
startY = ev.getY();
}
break;
case MotionEvent.ACTION_MOVE:
float tempY = ev.getY();
if (mFirstVisibleItem == 0 && !isRecord) {
isRecord = true;
startY = tempY;
}
if (state!=REFRESHING && isRecord ) {
offsetY = tempY - startY;
float currentHeight = (-headerViewHeight+offsetY/3);
float currentProgress = 1+currentHeight/headerViewHeight;
if (currentProgress>=1) {
currentProgress = 1;
}
if (state == RELEASE_TO_REFRESH && isRecord) {
setSelection(0);
if (-headerViewHeight+offsetY/3<0) {
state = PULL_TO_REFRESH;
changeHeaderByState(state);
}else if (offsetY<=0) {
state = DONE;
changeHeaderByState(state);
}
}
if (state == PULL_TO_REFRESH && isRecord) {
setSelection(0);
if (-headerViewHeight+offsetY/3>=0) {
state = RELEASE_TO_REFRESH;
changeHeaderByState(state);
}else if (offsetY<=0) {
state = DONE;
changeHeaderByState(state);
}
}
if (state == DONE && isRecord) {
if (offsetY>=0) {
state = PULL_TO_REFRESH;
}
}
if (state == PULL_TO_REFRESH) {
Log.i("zhangqi", ""+(int)(-headerViewHeight+offsetY/3));
headerView.setPadding(0,(int)(-headerViewHeight+offsetY/3) ,0,0);
mAutoHome.setCurrentProgress(currentProgress);
mAutoHome.postInvalidate();
}
if (state == RELEASE_TO_REFRESH) {
headerView.setPadding(0,(int)(-headerViewHeight+offsetY/3) ,0, 0);
mAutoHome.setCurrentProgress(currentProgress);
mAutoHome.postInvalidate();
}
}


break;
case MotionEvent.ACTION_UP:
if (state == PULL_TO_REFRESH) {
this.smoothScrollBy((int)(-headerViewHeight+offsetY/3)+headerViewHeight, 500);
changeHeaderByState(state);
}
if (state == RELEASE_TO_REFRESH) {
this.smoothScrollBy((int)(-headerViewHeight+offsetY/3), 500);
state = REFRESHING;
mOnRefreshListener.onRefresh();
changeHeaderByState(state);
}
isRecord = false;
break;
}

}
}
return super.onTouchEvent(ev);
}

private void changeHeaderByState(int state){
switch (state) {
case DONE:
headerView.setPadding(0, -headerViewHeight, 0, 0);
mAutoHome.setVisibility(View.VISIBLE);
mAutoHomeAnim.clearAnimation();
mAnimContainer.setVisibility(View.GONE);
break;
case RELEASE_TO_REFRESH:
tv_pull_to_refresh.setText("放开刷新");

break;
case PULL_TO_REFRESH:
tv_pull_to_refresh.setText("下拉刷新");
state = DONE;
mAutoHome.setVisibility(View.VISIBLE);
mAutoHomeAnim.clearAnimation();
mAnimContainer.setVisibility(View.GONE);
break;
case REFRESHING:
tv_pull_to_refresh.setText("正在刷新");
mAutoHome.setVisibility(View.GONE);
mAnimContainer.setVisibility(View.VISIBLE);
mAutoHomeAnim.clearAnimation();
mAutoHomeAnim.startAnimation(animation);
break;
default:
break;
}
}


private void measureView(View child) {
ViewGroup.LayoutParams p = child.getLayoutParams();
if (p == null) {
p = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT);
}
int childWidthSpec = ViewGroup.getChildMeasureSpec(0, 0 + 0, p.width);
int lpHeight = p.height;
int childHeightSpec;
if (lpHeight > 0) {
childHeightSpec = MeasureSpec.makeMeasureSpec(lpHeight,
MeasureSpec.EXACTLY);
} else {
childHeightSpec = MeasureSpec.makeMeasureSpec(0,
MeasureSpec.UNSPECIFIED);
}
child.measure(childWidthSpec, childHeightSpec);
}


}


//如何调用
mAdapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,mDatas);
mListView = (AutoHomeListView) findViewById(R.id.listview);
mListView.setAdapter(mAdapter);
mListView.setOnAutoHomeRefreshListener(this);

运行效果:

相关代码

  • AutoHomeRefreshListView仿汽车之家下拉刷新

  • PercentageBar自定义动态柱形图

  • Hide-Music-Player 一个完整的音乐播放器

  • FoldableLayout展开效果

  • ProgressRoundButton下载进度按钮变化动画

  • android 过渡动画研究

  • android资讯类软件框架

  • QuickSand图片点击后分裂成几份消失效果

  • MaterialPowerMenu 点击按钮切换页面加载呈现效果

  • PlayNewsStandDemo资讯类新闻客户端框架


更多相关文章

  1. Android之Notification-android学习之旅(二)
  2. Java获取文件的类型(扩展名)
  3. android添加以太网ethernet方法 android框架添加
  4. XCoreRedux框架:Android(安卓)UI组件化与Redux实践
  5. Android(安卓)动画实现弹幕效果
  6. Android(安卓)view的预加载占位效果
  7. VLC for Android(安卓): 编译问题 & 解决办法
  8. webView头部加进度加载效果
  9. Android(安卓)SimpleAdapter显示ListView、GridView

随机推荐

  1. android MediaScanner 扫出来的ID3 MP3文
  2. osmdroid 6.0.1基础测试
  3. TextView在单击时发送电子邮件
  4. Android学习笔记--《第一行代码Android》
  5. android-eclipse-phonegap 2..9以下(包含
  6. 如何将文件路径从.java类文件传递到本机j
  7. Android开发之线程与线程池
  8. Android时间日期类小结
  9. Android studio Run 出现 红叉 AndroidRu
  10. 截击后的截击似乎不奏效。