前言
前面我们讲解了滚动选择器的实现原理,并实现了字符串滚动选择器和图片选择器。没看过的同学建议先去了解一下:
《Android自定义view——滚动选择器》
《android图片滚动选择器的实现》
这些滚动选择器的滚动方向都是垂直的。今天我们在此基础上增加可以水平滚动的选择器。效果如下:
实现
对父类ScrollPickerView进行改进,参照垂直滚动,添加跟水平滑动相关的变量。
private boolean mIsHorizontal = false; // 是否水平滚动
private int mItemHeight = 0; // 每个条目的高度,当垂直滚动时,高度=mMeasureHeight/mVisibleItemCount
private int mItemWidth = 0; // 每个条目的宽度,当水平滚动时,宽度=mMeasureWidth/mVisibleItemCount
private int mItemSize; // 当垂直滚动时,mItemSize = mItemHeight;水平滚动时,mItemSize = mItemWidth
private int mCenterY; // 中间item的起始坐标y(不考虑偏移),当垂直滚动时,y= mCenterPosition*mItemHeight
private int mCenterX; // 中间item的起始坐标x(不考虑偏移),当垂直滚动时,x = mCenterPosition*mItemWidth
private int mCenterPoint; // 当垂直滚动时,mCenterPoint = mCenterY;水平滚动时,mCenterPoint = mCenterX
private float mLastMoveY; // 触摸的坐标y
private float mLastMoveX; // 触摸的坐标X
private int mLastScrollY = 0; // Scroller的坐标y
private int mLastScrollX = 0; // Scroller的坐标x
增加水平滚动后,在不同模式下,drawItem参数的意义相应改变。
/** * 绘制item * *@param canvas *@param data 数据集 *@param position 在data数据集中的位置 *@param relative 相对中间item的位置,relative==0表示中间item,relative<0表示上(左)边的item,relative>0表示下(右)边的item *@param moveLength 中间item滚动的距离,moveLength<0则表示向上(右)滚动的距离,moveLength>0则表示向下(左)滚动的距离 *@param top 当前绘制item的坐标,当垂直滚动时为顶部y的坐标;当水平滚动时为item最左边x的坐标 */
public abstract void