Activity定义使用的相关的属性:

/** 活动精选距离屏幕的坐标 */private int[] locationActive = new int[2];/** title标题距离屏幕的坐标 */private int locationTitleY;/** 是否手指向上滑动(startY>MoveY) */private boolean isMoveUp;/** 是否执行title显示或隐藏动画 */private boolean isRunAnim;/** 是否显示 */private boolean isTitleShow;/** title的高度 */int titleHeight;

初始化相关位置信息,:注必须是在加载完页面之后调用此代码,否则获取的location都为0

int[] locationTitle = new int[2];rlActTitleParent.getLocationOnScreen(locationTitle);titleHeight = getResources().getDimensionPixelSize(R.dimen.home_title_height);locationTitleY = locationTitle[1] + titleHeight;

location详解: http://blog.csdn.net/lvxiangan/article/details/19971509


lvWelfare.setOnMoveListener(new OnMoveListener() {@Overridepublic void onMoveList(Boolean isShow) {// 滑动显示隐藏titleisMoveUp = isShow;showTitle();}});lvWelfare.setOnScrollListenerExtra(new OnScrollListener() {@Overridepublic void onScrollStateChanged(AbsListView view, int scrollState) {// 这个方法只有松开手才会执行if (scrollState == SCROLL_STATE_IDLE) {// setOnMoveListener OnScrollListener结合滑动显示隐藏titleshowTitle();}}@Overridepublic void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {}});/*** *  * @description 显示title * @author zhongwr * @params * @update 2016年1月28日 下午5:56:35 */private void showTitle() {if (isRunAnim) {return;}rlActiveTitleParent.getLocationOnScreen(locationActive);if (isMoveUp) {// 手指向下滑动(starty locationTitleY) {if (!isTitleShow) {isTitleShow = true;rlActTitleParent.setVisibility(View.VISIBLE);setShowTitleAnimator(true);}}} else {// 手指向上滑动:starty>MoveYif (locationActive[1] <= locationTitleY) {if (isTitleShow) {isTitleShow = false;// rlActTitleParent.setVisibility(View.GONE);setShowTitleAnimator(false);}}}}/** *  * @description 设置动画 * @author zhongwr * @params * @update 2016年1月28日 下午6:00:45 */private void setShowTitleAnimator(final boolean isShow) {ValueAnimator animator;if (isShow) {// 显示animator = ValueAnimator.ofFloat(-titleHeight, 0).setDuration(200);} else {// 隐藏animator = ValueAnimator.ofFloat(0, -titleHeight).setDuration(200);}animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {@Overridepublic void onAnimationUpdate(ValueAnimator animation) {float translationY = (Float) animation.getAnimatedValue();// 设置控件rlActTitleParent沿Y移动动画,移动位置是translationYViewHelper.setTranslationY(rlActTitleParent, translationY);}});animator.addListener(new AnimatorListener() {@Overridepublic void onAnimationStart(Animator arg0) {isRunAnim = true;}@Overridepublic void onAnimationRepeat(Animator arg0) {}@Overridepublic void onAnimationEnd(Animator arg0) {isRunAnim = false;if (!isShow) {rlActTitleParent.setVisibility(View.GONE);}}@Overridepublic void onAnimationCancel(Animator arg0) {isRunAnim = false;}});animator.start();}

lvWelfare:Listview(集合上拉加载更多,下拉刷新功能;以上定义的回调接口以及onTouchEvent()都在这个类中

public class PullToRefreshListView extends ListView implements OnScrollListener {private static final String TAG = "ElasticScrollView";private final static int RELEASE_To_REFRESH = 0;private final static int PULL_To_REFRESH = 1;private final static int REFRESHING = 2;private final static int DONE = 3;private final static int LOADING = 4;// 实际的padding的距离与界面上偏移距离的比例private final static int RATIO = 3;private int headContentWidth;private int headContentHeight;private LinearLayout innerLayout;private LinearLayout headView;private ProgressBar arrowImageView;private ProgressBar progressBar;private TextView tipsTextview;private TextView lastUpdatedTextView;private OnRefreshListener refreshListener;private OnMoveListener mOnMoveListener;private OnScrollStateChangedListener mScrollStateChangedListener;private boolean isRefreshable;private int state;private boolean isBack;// private RotateAnimation animation;// private RotateAnimation reverseAnimation;private boolean canReturn;private boolean isRecored;private int startY;private String down_str = "下拉刷新";private String release_str = "松开刷新";private OnPullUpListener pullUpListener;private Context mContext;public PullToRefreshListView(Context context) {super(context);init(context);}public PullToRefreshListView(Context context, AttributeSet attrs) {super(context, attrs);init(context);}private void init(Context context) {mContext = context;LayoutInflater inflater = LayoutInflater.from(context);View view = getFirstHeadView();if(view != null){addHeaderView(view);}headView = (LinearLayout) inflater.inflate(R.layout.mylistview_head, null);arrowImageView = (ProgressBar) headView.findViewById(R.id.head_arrowImageView);progressBar = (ProgressBar) headView.findViewById(R.id.head_progressBar);tipsTextview = (TextView) headView.findViewById(R.id.head_tipsTextView);lastUpdatedTextView = (TextView) headView.findViewById(R.id.head_lastUpdatedTextView);measureView(headView);headContentHeight = headView.getMeasuredHeight();headContentWidth = headView.getMeasuredWidth();headView.setPadding(0, -1 * headContentHeight, 0, 0);headView.invalidate();Log.i("size", "width:" + headContentWidth + " height:" + headContentHeight);addHeaderView(headView);// animation = new RotateAnimation(0, -180,// Animation.RELATIVE_TO_SELF, 0.5f,// Animation.RELATIVE_TO_SELF, 0.5f);// animation.setInterpolator(new LinearInterpolator());// animation.setDuration(250);// animation.setFillAfter(true);//// reverseAnimation = new RotateAnimation(-180, 0,// Animation.RELATIVE_TO_SELF, 0.5f,// Animation.RELATIVE_TO_SELF, 0.5f);// reverseAnimation.setInterpolator(new LinearInterpolator());// reverseAnimation.setDuration(200);// reverseAnimation.setFillAfter(true);state = DONE;isRefreshable = false;canReturn = false;}public View getFirstHeadView(){return null;}@Overridepublic boolean onTouchEvent(MotionEvent event) {try {if (isRefreshable) {switch (event.getAction()) {case MotionEvent.ACTION_DOWN:if (getScrollY() == 0 && !isRecored) {isRecored = true;startY = (int) event.getY();Log.i(TAG, "在down时候记录当前位置‘");}break;case MotionEvent.ACTION_UP:if (state != REFRESHING && state != LOADING) {if (state == DONE) {// 什么都不做}if (state == PULL_To_REFRESH) {state = DONE;changeHeaderViewByState();onPullUp();Log.i(TAG, "由下拉刷新状态,到done状态");}if (state == RELEASE_To_REFRESH) {state = REFRESHING;changeHeaderViewByState();onRefresh();onPullUp();Log.i(TAG, "由松开刷新状态,到done状态");}}isRecored = false;isBack = false;break;case MotionEvent.ACTION_MOVE:int tempY = (int) event.getY();if (!isRecored && getScrollY() == 0) {Log.i(TAG, "在move时候记录下位置");isRecored = true;startY = tempY;} else {if (startY < tempY) {if (mOnMoveListener != null) {mOnMoveListener.onMoveList(true);}} else {if (mOnMoveListener != null) {mOnMoveListener.onMoveList(false);}}}if (state != REFRESHING && isRecored && state != LOADING&& PullToRefreshListView.this.getFirstVisiblePosition() == 0) {// 可以松手去刷新了if (state == RELEASE_To_REFRESH) {canReturn = true;if (((tempY - startY) / RATIO < headContentHeight) && (tempY - startY) > 0) {state = PULL_To_REFRESH;changeHeaderViewByState();Log.i(TAG, "由松开刷新状态转变到下拉刷新状态");}// 一下子推到顶了else if (tempY - startY <= 0) {state = DONE;changeHeaderViewByState();Log.i(TAG, "由松开刷新状态转变到done状态");} else {// 不用进行特别的操作,只用更新paddingTop的值就行了}}// 还没有到达显示松开刷新的时候,DONE或者是PULL_To_REFRESH状态if (state == PULL_To_REFRESH) {canReturn = true;// 下拉到可以进入RELEASE_TO_REFRESH的状态if ((tempY - startY) / RATIO >= headContentHeight) {state = RELEASE_To_REFRESH;isBack = true;changeHeaderViewByState();Log.i(TAG, "由done或者下拉刷新状态转变到松开刷新");}// 上推到顶了else if (tempY - startY <= 0) {state = DONE;changeHeaderViewByState();Log.i(TAG, "由DOne或者下拉刷新状态转变到done状态");}}// done状态下if (state == DONE) {if (tempY - startY > 0) {state = PULL_To_REFRESH;changeHeaderViewByState();}}// 更新headView的sizeif (state == PULL_To_REFRESH) {headView.setPadding(0, -1 * headContentHeight + (tempY - startY) / RATIO, 0, 0);}// 更新headView的paddingTopif (state == RELEASE_To_REFRESH) {headView.setPadding(0, (tempY - startY) / RATIO - headContentHeight, 0, 0);}if (canReturn) {canReturn = false;return true;}}break;}}return super.onTouchEvent(event);} catch (Exception ex) {ex.printStackTrace();return false;}}/** * 显示“正在刷新”view */public void showRefreshingView() {state = REFRESHING;changeHeaderViewByState();}// 当状态改变时候,调用该方法,以更新界面private void changeHeaderViewByState() {switch (state) {case RELEASE_To_REFRESH:arrowImageView.setVisibility(View.VISIBLE);progressBar.setVisibility(View.GONE);tipsTextview.setVisibility(View.VISIBLE);lastUpdatedTextView.setVisibility(View.VISIBLE);// arrowImageView.clearAnimation();// arrowImageView.startAnimation(animation);tipsTextview.setText(release_str);Log.i(TAG, "当前状态,松开刷新");break;case PULL_To_REFRESH:progressBar.setVisibility(View.GONE);tipsTextview.setVisibility(View.VISIBLE);lastUpdatedTextView.setVisibility(View.VISIBLE);arrowImageView.clearAnimation();arrowImageView.setVisibility(View.VISIBLE);// 是由RELEASE_To_REFRESH状态转变来的if (isBack) {isBack = false;// arrowImageView.clearAnimation();// arrowImageView.startAnimation(reverseAnimation);tipsTextview.setText(down_str);} else {tipsTextview.setText(down_str);}Log.i(TAG, "当前状态,下拉刷新");break;case REFRESHING:headView.setPadding(0, 0, 0, 0);progressBar.setVisibility(View.VISIBLE);arrowImageView.clearAnimation();arrowImageView.setVisibility(View.GONE);tipsTextview.setText("正在刷新...");lastUpdatedTextView.setVisibility(View.VISIBLE);Log.i(TAG, "当前状态,正在刷新...");break;case DONE:headView.setPadding(0, -1 * headContentHeight, 0, 0);progressBar.setVisibility(View.GONE);arrowImageView.clearAnimation();arrowImageView.destroyDrawingCache();progressBar.destroyDrawingCache();// arrowImageView.setImageResource(R.drawable.head_arrow);tipsTextview.setText(down_str);lastUpdatedTextView.setVisibility(View.VISIBLE);Log.i(TAG, "当前状态,done");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);}public void setOnMoveListener(OnMoveListener moveListener) {this.mOnMoveListener = moveListener;}public interface OnMoveListener {public void onMoveList(Boolean isShow);}public void setonRefreshListener(OnRefreshListener refreshListener) {this.refreshListener = refreshListener;isRefreshable = true;}public interface OnRefreshListener {public void onRefresh();}@SuppressWarnings("deprecation")public void onRefreshComplete() {state = DONE;lastUpdatedTextView.setText("最近更新:" + new Date().toLocaleString());changeHeaderViewByState();invalidate();scrollTo(0, 0);}public void setDownStr(String s) {down_str = s;}public void setReleaseStr(String s) {release_str = s;}private void onRefresh() {if (refreshListener != null) {if (null != mLoadingMoreListener) {setFootVisiable(View.GONE, View.GONE, llFootLoadingParent.getVisibility());}refreshListener.onRefresh();}}public void addChild(View child) {innerLayout.addView(child);}public void addChild(View child, int position) {innerLayout.addView(child, position);}public int getState() {return state;}public void setState(int state) {this.state = state;}private void onPullUp() {if (pullUpListener != null) {pullUpListener.onPullUp();}}public void setOnPullUpListener(OnPullUpListener pullUpListener) {this.pullUpListener = pullUpListener;}public interface OnPullUpListener {public void onPullUp();}/** * xml加载完之后会调用这个方法 * */@Overrideprotected void onFinishInflate() {super.onFinishInflate();}/** 加载更多的底部 */private View mFootView;private RelativeLayout rlFootNoMoreParent;private LinearLayout llFootLoadingParent;/** 加载更多的监听器 */private OnLoadingMoreListener mLoadingMoreListener;/** 加载出错时,点击加载更多 */private Button btnReload;/**没有更多*/private TextView tvNoMoreText;/** 设置上拉加载更多可用 */public void setLoadingMoreEnable(OnLoadingMoreListener loadingMoreListener) {this.mLoadingMoreListener = loadingMoreListener;// 添加底部mFootView = LayoutInflater.from(mContext).inflate(R.layout.get_more, null);rlFootNoMoreParent = (RelativeLayout) this.mFootView.findViewById(R.id.rl_no_more_parent);llFootLoadingParent = (LinearLayout) this.mFootView.findViewById(R.id.ll_loading_parent);tvNoMoreText = (TextView) this.mFootView.findViewById(R.id.foot_layout_no_more_text);btnReload = (Button) this.mFootView.findViewById(R.id.bt_load);btnReload.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {if ("加载失败,点击重试".equals(btnReload.getText().toString()) && null != mLoadingMoreListener) {mLoadingMoreListener.onLoadingMore(PullToRefreshListView.this, OnScrollListener.SCROLL_STATE_IDLE);}}});// 首次加载应该是隐藏的// setFootVisiable(View.VISIBLE, View.GONE, View.GONE);addFooterView(this.mFootView);// 添加底部之后就可以上拉加载更多 :这个监听器,可以消除上滑的时候不加载图片setOnScrollListener(new PauseOnScrollListener(ImageLoader.getInstance(), true, true, this));}/** *  * @description 设置没有更多文本颜色值 * @author zhongwr * @update 2015-12-14 下午8:26:07 */public void setNoMoreTextColor(int colorResId) {if (null != tvNoMoreText) {tvNoMoreText.setTextColor(colorResId);}}public View getFootView() {return mFootView;}public boolean removeFootView() {return removeFooterView(this.mFootView);}/** *  * @description 加载完成 * @param isNoMore *            是否没有更多了 * @author zhongwr * @update 2015-11-6 上午1:08:15 */public void setOnLoadingMoreCompelete(boolean isNoMore) {setOnLoadingMoreCompelete(isNoMore, false);}public void setOnLoadingMoreCompelete() {setFootVisiable(View.GONE, View.GONE, View.GONE);this.isLoadingMore = false;}/** *  * @description 加载完成 * @param isNoMore *            是否没有更多了 * @param isLoadingMoreFailed *            加载更多时出错 * @author zhongwr * @update 2015-11-6 上午1:08:15 */public void setOnLoadingMoreCompelete(boolean isNoMore, boolean isLoadingMoreFailed) {if (!isLoadingMoreFailed) {if (!"加载更多...".equals(btnReload.getText().toString())) {btnReload.setText("加载更多...");}if (isNoMore) {setFootVisiable(View.VISIBLE, View.VISIBLE, View.GONE);} else {setFootVisiable(View.VISIBLE, View.GONE, View.VISIBLE);}} else {// 加载失败,提示点击重试btnReload.setText("加载失败,点击重试");setFootVisiable(View.VISIBLE, View.GONE, View.VISIBLE);}this.isLoadingMore = false;}/*** *  * @description 用于下拉刷新时,隐藏底部 * @author zhongwr * @update 2015-11-25 下午5:24:51 */public void hiddenFootView() {if (null != mFootView) {isLoadingMore = false;mFootView.setVisibility(View.GONE);}}/** *  * @description 显示底部 * @author zhongwr * @params * @update 2016年1月4日 下午4:16:06 */public void showFootView() {if (null != mFootView) {mFootView.setVisibility(View.VISIBLE);}}/*** *  * @description 设置底部可见:加载更多或没有更多 * @author zhongwr * @param footView *            这个底部是否可见 * @param footNoMoreParent *            没有更多是否可见 * @param footLoadingParent *            加载更多是否可见 * @update 2015年9月24日 上午11:26:32 */private void setFootVisiable(int footView, int footNoMoreParent, int footLoadingParent) {if (null != mFootView) {if (footView != mFootView.getVisibility()) {mFootView.setVisibility(footView);}// 整个底部可见,设置子布局是否可见if (footNoMoreParent != rlFootNoMoreParent.getVisibility()) {this.rlFootNoMoreParent.setVisibility(footNoMoreParent);}if (footLoadingParent != llFootLoadingParent.getVisibility()) {llFootLoadingParent.setVisibility(footLoadingParent);}}}/** 是否加载更多 */private boolean isLoadingMore;@Overridepublic void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {if(mOnScrollListenerExtra != null){mOnScrollListenerExtra.onScroll(view, firstVisibleItem, visibleItemCount, totalItemCount);}}@Overridepublic void onScrollStateChanged(AbsListView view, int scrollState) {// 不是首页&历史数据没有加载完&最后一天item&上一次已经加载完成Logcat.dLog("isLoadingMore = " + (view.getLastVisiblePosition() == view.getCount() - 1) + " idle = "+ (scrollState == SCROLL_STATE_IDLE) + " done = " + (state == DONE) + " isLoadingMore = "+ isLoadingMore);Logcat.dLog("rlFootNoMoreParent = "+(rlFootNoMoreParent.getVisibility() == View.GONE));if (rlFootNoMoreParent.getVisibility() == View.GONE && view.getLastVisiblePosition() == view.getCount() - 1 && scrollState == SCROLL_STATE_IDLE && state == DONE&& !isLoadingMore) {isLoadingMore = true;setFootVisiable(View.VISIBLE, View.GONE, View.VISIBLE);if (null != mLoadingMoreListener) {mLoadingMoreListener.onLoadingMore(view, scrollState);}}// 实现滑动状态改变事件if (mScrollStateChangedListener != null) {mScrollStateChangedListener.onScrollStateChanged(view, scrollState);}if(mOnScrollListenerExtra != null){mOnScrollListenerExtra.onScrollStateChanged(view, scrollState);}}/** * @Description 增加ListView滑动状态改变监听 接口 * @author chenxinghong * @date 2015-12-17 */public interface OnScrollStateChangedListener {public void onScrollStateChanged(AbsListView view, int scrollState);}public void setOnScrollStateChangedListener(OnScrollStateChangedListener listener) {this.mScrollStateChangedListener = listener;}private OnScrollListener mOnScrollListenerExtra;public void setOnScrollListenerExtra(OnScrollListener listener) {this.mOnScrollListenerExtra = listener;}/*** * 加载更多的接口 *  * @author zhongwr * @update 2015年9月28日 下午6:03:35 */public interface OnLoadingMoreListener {public void onLoadingMore(AbsListView view, int scrollState);}}




更多相关文章

  1. android自定义dialog,软件键盘弹出挡住输入区域解决
  2. android音乐播放器监听电话状态
  3. Android(安卓)app 优化
  4. Android如何用代码重复加载同一个xml
  5. Android开源库项目及库汇总——动画
  6. Android后台服务Service
  7. [android] Activity 的生命周期 以及 横屏竖屏切换时 Activity
  8. 什么是Activity
  9. Listview 去除分割线、操作各种默认背景色、刷新到最后等优化

随机推荐

  1. 窗口函数更新
  2. Oracle OCP 19c 认证1Z0-083考试题库(第5
  3. 混合加密应用方案
  4. 虚拟机常见的网络类型有哪些?linux运维学
  5. 1216CSS优先级
  6. 命名空间与数据库基础
  7. 1215css基础
  8. MySQL基础: 预处理和常用的MySQL函数
  9. CURD常用操作、select常用查询、预处理原
  10. 小写转大写(ASCLL)