一个简单的滚轮选取控件

网上有很多滑动选取的控件,比如Android-wheel,github地址,本文只是记录下以前写过的类似控件的思路,不适合实际项目使用。
效果图
先来讲讲思路,我这样重复造轮子不太好,而且实现的功能也比较简陋,不过还是打算写下来,记录一下自己成长的过程。

控件中准备将控件中的控件项通过onDraw()中的drawText()绘制出来,准备用一个数字values[]来保存item项的值。那么问题来了,我们要怎么判断该绘制哪几个item?

分两种情况讨论,
1,静止状态:
用一个index来保存当前item在数组中的游标位置,只需要绘制游标左右两项就可以了。

for (int i = -1; i <= 1; i++) {
    canvas.drawText(values[getIndex(index + i)] + "", centerX, calBaseline(TOP * (i + 1), TOP * (i + 1) + TEXT_HEIGHTPX, paint), paint);
}

2,滑动状态:
在滑动过程中,随时更新游标的位置,

changY为相对上一次静止位置滑动的距离(矢量)

     index = getIndex(lastIndex - Math.round((float) changeY / TEXT_HEIGHTPX));

记录上一次静止状态的lastIndex,由lastIndex左右遍历,画出屏幕区域内的item。

            int indexTop = TOP + changeY;
            int top;
            int i = -1;
            while ((top = indexTop + TEXT_HEIGHTPX * i) < 3 * TEXT_HEIGHTPX) {
                int newIndex = getIndex(lastIndex + i);
                if (newIndex == index) {
                    paint.setTextSize(TEXT_SIZE_BIG);
                } else {
                    paint.setTextSize(TEXT_SIZE);
                }
                canvas.drawText(values[newIndex] + "", centerX, calBaseline(top, top + TEXT_HEIGHTPX, paint), paint);
                i++;
            }

            i = 1;
            while ((top = indexTop + TEXT_HEIGHTPX * i) > -TEXT_HEIGHTPX) {
                int newIndex = getIndex(lastIndex + i);
                if (newIndex == index) {
                    paint.setTextSize(TEXT_SIZE_BIG);
                } else {
                    paint.setTextSize(TEXT_SIZE);
                }
                canvas.drawText(values[newIndex] + "", centerX, calBaseline(top, top + TEXT_HEIGHTPX, paint), paint);
                i--;

下载地址

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值