用B4A实现ScrollView边界回弹效果

ldhyob

Member
Licensed User
Longtime User
Android的UI和用户体验,与IOS相比,似乎总觉着要差一些。虽然Android版本在更新升级,对系统的各个方法进行了大量实质性的优化,但他的显示效果和交互体验依然不及IOS。例如IOS上的很多控件都是带弹性的,也就是拖拽一个控件到了该控件的边界,但是控件依然可以随着手指的移动而移动一段距离。这样的话,给用户的感觉就不那么生硬,能在一定程度上提升用户体验。我们在用B4A做安卓应用开发时,ScrollView是我们经常会使用到的控件,默认是没有这种边界弹性效果的。“临渊羡鱼,不如退而结网”,经过摸索,发现在B4A中只要通过对ScrollView做些改良,完全可以实现这个回弹效果,下面我给出自己的实现方式,和大家交流分享:
完成后效果:
dd.gif

一、实现大体思路

总的思路是通过动态修改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

  • spring-scrollview.apk
    446.6 KB · Views: 509
Last edited:
Top