Android自定义控件(二),android自定义控件
这一篇主要来讲一下自定义控件中的自定义viewgroup,我们以项目中最常用的下拉刷新和加载更多组件为例
简单介绍一下自定义viewgroup时应该怎么做。
分析:下拉刷新和加载更多的原理和步骤
自定义一个viewgroup,将headerview、contentview和footerview从上到下依次布局,然后在初始化的时候
通过Scrooller滚动使得该组件在y轴方向上滚动headerview的高度,这样headerview就被隐藏了。而contentview的
宽度和高度都是match_parent的,因此屏幕上 headerview和footerview就都被隐藏在屏幕之外了。当contentview被
滚动到顶部,如果此时用户继续下拉,那么下拉刷新组件将拦截触摸事件,然后根据用户的触摸事件获取到手指滑动的
y轴距离,并通过scroller将该下拉组件在y轴上滚动手指滑动的距离,实现headerview的显示和隐藏,从而达到下拉的效果
。当用户滑动到最底部时会触发加载更多的操作,此时会通过scroller滚动该下拉刷新组件,将footerview显示出来,实现加载更多
的效果。具体步骤如下:
第一步:初始化View即headerView contentView和footerView
第二步:测量三个view的大小,并计算出viewgroup的大小
第三步:布局,将三个view在界面上布局,按照上中下的顺序
第四步:监听屏幕的触摸事件,判断是否下拉刷新或者加载更多
第五步:触发下拉刷新和加载更多事件执行下拉刷新和加载更多
第六步:下拉刷新和加载更多执行完后的重置操作
示例代码:
自定义的viewgroup
1 package com.jiao.simpleimageview.view; 2 3 import android.content.Context; 4 import android.graphics.Color; 5 import android.support.v4.view.MotionEventCompat; 6 import android.util.AttributeSet; 7 import android.view.LayoutInflater; 8 import android.view.MotionEvent; 9 import android.view.View; 10 import android.view.ViewGroup; 11 import android.view.animation.RotateAnimation; 12 import android.widget.AbsListView; 13 import android.widget.AbsListView.OnScrollListener; 14 import android.widget.ImageView; 15 import android.widget.ProgressBar; 16 import android.widget.Scroller; 17 import android.widget.TextView; 18 19 import com.jiao.simpleimageview.R; 20 import com.jiao.simpleimageview.listener.OnLoadListener; 21 import com.jiao.simpleimageview.listener.OnRefreshListener; 22 23 import java.text.SimpleDateFormat; 24 import java.util.Date; 25 26 /** 27 * Created by jiaocg on 2016/3/24. 28 */ 29 public abstract class RefreshLayoutBase<T extends View> extends ViewGroup implements 30 OnScrollListener { 31 32 /** 33 * 34 */ 35 protected Scroller mScroller; 36 37 /** 38 * 下拉刷新时显示的header view 39 */ 40 protected View mHeaderView; 41 42 /** 43 * 上拉加载更多时显示的footer view 44 */ 45 protected View mFooterView; 46 47 /** 48 * 本次触摸滑动y坐标上的偏移量 49 */ 50 protected int mYOffset; 51 52 /** 53 * 内容视图, 即用户触摸导致下拉刷新、上拉加载的主视图. 比如ListView, GridView等. 54 */ 55 protected T mContentView; 56 57 /** 58 * 最初的滚动位置.第一次布局时滚动header的高度的距离 59 */ 60 protected int mInitScrollY = 0; 61 /** 62 * 最后一次触摸事件的y轴坐标 63 */ 64 protected int mLastY = 0; 65 66 /** 67 * 空闲状态 68 */ 69 public static final int STATUS_IDLE = 0; 70 71 /** 72 * 下拉或者上拉状态, 还没有到达可刷新的状态 73 */ 74 public static final int STATUS_PULL_TO_REFRESH = 1; 75 76 /** 77 * 下拉或者上拉状态 78 */ 79 public static final int STATUS_RELEASE_TO_REFRESH = 2; 80 /** 81 * 刷新中 82 */ 83 public static final int STATUS_REFRESHING = 3; 84 85 /** 86 * LOADING中 87 */ 88 public static final int STATUS_LOADING = 4; 89 90 /** 91 * 当前状态 92 */ 93 protected int mCurrentStatus = STATUS_IDLE; 94 95 /** 96 * header中的箭头图标 97 */ 98 private ImageView mArrowImageView; 99 /** 100 * 箭头是否向上 101 */ 102 private boolean isArrowUp; 103 /** 104 * header 中的文本标签 105 */ 106 private TextView mTipsTextView; 107 /** 108 * header中的时间标签 109 */ 110 private TextView mTimeTextView; 111 /** 112 * header中的进度条 113 */ 114 private P