团购网站建站,广州中国建设银行网站首页,厦门企业网站建设公司,张雪峰谈建筑学前景2019独角兽企业重金招聘Python工程师标准 AutoHomeRefreshListView仿汽车之家下拉刷新 AutoHomeRefreshListView 高仿汽车之家下拉刷新 #xff0c;下拉的时候出现很不错的效果。本项目来自#xff1a;https://github.com/nugongshou110/AutoHomeRefreshListVi… 2019独角兽企业重金招聘Python工程师标准 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 (-headerViewHeightoffsetY/3); float currentProgress 1currentHeight/headerViewHeight; if (currentProgress1) { currentProgress 1; } if (state RELEASE_TO_REFRESH isRecord) { setSelection(0); if (-headerViewHeightoffsetY/30) { state PULL_TO_REFRESH; changeHeaderByState(state); }else if (offsetY0) { state DONE; changeHeaderByState(state); } } if (state PULL_TO_REFRESH isRecord) { setSelection(0); if (-headerViewHeightoffsetY/30) { state RELEASE_TO_REFRESH; changeHeaderByState(state); }else if (offsetY0) { state DONE; changeHeaderByState(state); } } if (state DONE isRecord) { if (offsetY0) { state PULL_TO_REFRESH; } } if (state PULL_TO_REFRESH) { Log.i(zhangqi, (int)(-headerViewHeightoffsetY/3)); headerView.setPadding(0,(int)(-headerViewHeightoffsetY/3) ,0,0); mAutoHome.setCurrentProgress(currentProgress); mAutoHome.postInvalidate(); } if (state RELEASE_TO_REFRESH) { headerView.setPadding(0,(int)(-headerViewHeightoffsetY/3) ,0, 0); mAutoHome.setCurrentProgress(currentProgress); mAutoHome.postInvalidate(); } } break; case MotionEvent.ACTION_UP: if (state PULL_TO_REFRESH) { this.smoothScrollBy((int)(-headerViewHeightoffsetY/3)headerViewHeight, 500); changeHeaderByState(state); } if (state RELEASE_TO_REFRESH) { this.smoothScrollBy((int)(-headerViewHeightoffsetY/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 ArrayAdapterString(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资讯类新闻客户端框架 转载于:https://my.oschina.net/u/2461971/blog/524883