自定义滚动按钮(滚轮)进度调节器

在开发中遇到一个类似鼠标滚轮效果的UI,在这里写下我的实现思路,希望对你有所帮助。

效果图如下:


一个滚动条,通过上下滚动来调节进度。这里的难点是滚动时的动画效果,下面一一说来。


实现思路

1,绘制一组动画图片,从第一个小横杠开始到第一个小横杠结束滚动的这一过程我们用20帧来表示

  • 绘制中间的滚动轴
  • 用得到的滚动轴与一个比背景圆略小的圆合成,插入滚轴Y值的偏移量,用背景圆减去滚轴多余的部分
  • 把滚轴和图片背景相结合生成最终的图片
  • 不断改变滚轴与背景圆的在Y轴的偏移量,生成一组动画图片

 2, 重写View,显示滚动效果 
View的onTouch()方法,监听MOVE事件,在滑动改变时改变进度,并根据进度来得到此时应该绘制图片的Index帧。

1,初始化View大小,动画帧等
        在构造函数中初始化View大小,动画帧等。我在这里只重写了ScrollBallView(Context context, AttributeSet attrs)构造函数,由于在布局文件中是重写调用该方法来创建对象。当然如果有需要最好把View的三个构造函数都重写了吧。


2,重写onTouchEvent()方法,监听DOWN、MOVE、UP事件
    在DOWN事件中,判断是否可以滑动View,以及初始化相关参数,并返回true来继续接受之后的事件
    在MOVE事件中,获取每次移动的距离,通过该值的变化来改变进度和确定显示哪一帧图片,最后触发监听事件
    在UP事件中,再次初始化并释放相关资源


3,MOVE事件分析
    在MOVE事件中,我们调用了@setScroll(int dy)方法处理滑动的值,
        传入的值dy为本次MOVE时在屏幕上的触摸点与上次在屏幕上触摸点的差值,数字的大小与手指在屏幕上移动的速度有关,不同方向得到正负值
        然后把滑动值记录下来,当滚动值大于最大值或小于0时,限制值,并不做更新,只有在合法范围内才去做响应的更新
        正常情况下会进入@getScrollIndex(int dy)方法,把值移动的距离累加,之后模以移动每一个刻度显示的帧数,就是当前要显示哪一帧了

3,给自定义View添加监听 
在MotionEvent.ACTION_MOVE事件中回调监听,获取一个百分比的进度。

注:滑动总数为Interger的一半,是为了解决Interger为负数时滚动条的滚动方向与手势方向相反的BUG。
mScrollIndexSum = Integer.MAX_VALUE / 2

Demo地址:https://github.com/iOnesmile/ScrollBallDemo

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C#自定义控件滚动条的实现方法有多种。根据提供的引用内容,我可以为您提供以下方法和步骤来实现滚动条功能: 方法一: 1. 创建一个控件类,可以继承自Panel或者UserControl。该类将作为滚动条的容器。 2. 在该控件类中添加需要滚动的控件作为子控件。 3. 为该控件类添加滚动条控件,可以使用VScrollBar(竖向滚动条)或HScrollBar(横向滚动条)控件。 4. 设置滚动条控件的属性,如Maximum(可滚动范围的上限值)、SmallChange(小距离移动值)、LargeChange(大距离移动值)和Value(滚动条的当前位置)。 5. 给滚动条控件的Scroll事件添加处理方法,以便在滚动时对子控件进行相应操作。 方法二: 1. 创建一个视图类,为自定义控件动态添加滚动条,并处理滚动条的显示、隐藏和滚动事件。 2. 在该视图类的构造函数中传入自定义控件实例。 3. 在视图类中创建VScrollBar(竖向滚动条)和HScrollBar(横向滚动条)控件,并将其添加到自定义控件中。 4. 设置滚动条控件的属性,如Dock(使滚动条固定在底部或右侧)、Maximum(可滚动范围的上限值)和LargeChange(大距离移动值)。 5. 订阅滚动条控件的事件,如Scroll(滚动条发生滚动时触发事件)和MouseWheel(根据滚轮滚动方向滚动滚动条)。 6. 在事件处理方法中,根据滚动条的值和滚动方向,对自定义控件进行滚动操作。 以上是两种常见的实现滚动条功能的方法。您可以根据自己的需求选择其中一种或根据具体情况进行修改和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值