Android的UI和用户体验,与IOS相比,似乎总觉着要差一些。虽然Android版本在更新升级,对系统的各个方法进行了大量实质性的优化,但他的显示效果和交互体验依然不及IOS。例如IOS上的很多控件都是带弹性的,也就是拖拽一个控件到了该控件的边界,但是控件依然可以随着手指的移动而移动一段距离。这样的话,给用户的感觉就不那么生硬,能在一定程度上提升用户体验。我们在用B4A做安卓应用开发时,ScrollView是我们经常会使用到的控件,默认是没有这种边界弹性效果的。“临渊羡鱼,不如退而结网”,经过摸索,发现在B4A中只要通过对ScrollView做些改良,完全可以实现这个回弹效果,下面我给出自己的实现方式,和大家交流分享:
完成后效果:
一、实现大体思路
总的思路是通过动态修改ScrollView的数据区内容和高度来达到目的,具体是为ScrollView分别增加一个初始高度为0的HeaderView和TailerView,如果滚动到第一个条目或是最末一个条目的位置,用户依然向上或向下拖拽,那么就增加HeaderView或TailerView的高度,实现拉伸效果,当用户松开手指,就将HeaderView、TailerView的高度组件递减到0,实现回弹效果。
二、实现关键步骤
要实现以上思路,要通过以下关键步骤解决一系列问题:
1.布局规划:为便于操作,将ScrollView的Panel加载的内容划分为三个区域:HeaderView、DataView、TailerView,这三个区域分别对应头部、正文、尾部,用三个Panel作为各自的父控件,用于装载相应内容。之所以选用Panel为父容器,主要是考虑到动态改变各区域位置和高度时的方便性。
2.边界探测:B4A中ScrollView仅有一个事件过程“ScrollChanged”,它能返回控件当前的滚动位置Position,虽能判断操作是否抵达上下边界,但是并不能捕获用户拖拽动作,即到达边界时,是向上还是向下移动手指?利用该事件则无法做出判断。如何解决这个问题?还好,B4A提供给我们有强大的反射库,利用它的SetOnTouchListener方法,我们就可以实现对View组件的触碰事件捕获。通过在触碰事件中对返回参数Y的实时比对,进而判断出用户手势。
3.回弹效果:在头部或尾部通过拖拽拉拉伸显示出来后,当用户释放手指,ScrollView将自动回弹,该效果可通过设置时钟控件在一定范围内改变ScrollView的ScrollPosition属性,就可以模拟出平滑的动画回弹效果。
三、主要代码片断
有了这个框架后,就完全可以实现类似向下拖拽刷新的界面效果,在配合上图标旋转的小动画加以点缀,相信可以为您的程序增色不少^_^
完成后效果:
一、实现大体思路
总的思路是通过动态修改ScrollView的数据区内容和高度来达到目的,具体是为ScrollView分别增加一个初始高度为0的HeaderView和TailerView,如果滚动到第一个条目或是最末一个条目的位置,用户依然向上或向下拖拽,那么就增加HeaderView或TailerView的高度,实现拉伸效果,当用户松开手指,就将HeaderView、TailerView的高度组件递减到0,实现回弹效果。
二、实现关键步骤
要实现以上思路,要通过以下关键步骤解决一系列问题:
1.布局规划:为便于操作,将ScrollView的Panel加载的内容划分为三个区域:HeaderView、DataView、TailerView,这三个区域分别对应头部、正文、尾部,用三个Panel作为各自的父控件,用于装载相应内容。之所以选用Panel为父容器,主要是考虑到动态改变各区域位置和高度时的方便性。
2.边界探测:B4A中ScrollView仅有一个事件过程“ScrollChanged”,它能返回控件当前的滚动位置Position,虽能判断操作是否抵达上下边界,但是并不能捕获用户拖拽动作,即到达边界时,是向上还是向下移动手指?利用该事件则无法做出判断。如何解决这个问题?还好,B4A提供给我们有强大的反射库,利用它的SetOnTouchListener方法,我们就可以实现对View组件的触碰事件捕获。通过在触碰事件中对返回参数Y的实时比对,进而判断出用户手势。
3.回弹效果:在头部或尾部通过拖拽拉拉伸显示出来后,当用户释放手指,ScrollView将自动回弹,该效果可通过设置时钟控件在一定范围内改变ScrollView的ScrollPosition属性,就可以模拟出平滑的动画回弹效果。
三、主要代码片断
B4X:
'绑定触碰监听事件
Sub ScrollView_Touch (viewtag As Object, action As Int, X As Float, Y As Float, motionevent As Object) As Boolean
Select Case action
Case 0
'按下
StartY1=-1
StartY2=-1
IsOverScroll1=False
IsOverScroll2=False
Case 1
'弹起
StartY1=-1
StartY2=-1
If IsOverScroll1 Then
SubHeader '移除头部区域
End If
If IsOverScroll2 Then
SubTailer '移除尾部区域
End If
Case 2
'拖动
If StartY1<>-1 Then
If Y>StartY1 And IsOverScroll1=False Then
'向下拖动,准备显示头部
IsOverScroll1=True
AddHeader '增加头部区域
End If
End If
If StartY2<>-1 Then
If Y<StartY2 And IsOverScroll2=False Then
'向上拖动,准备露出尾部
IsOverScroll2=True
AddTailer '增加尾部区域
End If
End If
If SV.ScrollPosition=0 And IsOverScroll1=False Then
'到顶部
StartY1=Y
End If
If SV.ScrollPosition=SV.Panel.Height-SV.Height And IsOverScroll2=False Then
'到底部
StartY2=Y
End If
End Select
Return False '允许继续响应控件事件
End Sub
有了这个框架后,就完全可以实现类似向下拖拽刷新的界面效果,在配合上图标旋转的小动画加以点缀,相信可以为您的程序增色不少^_^
Attachments
Last edited: