6

我正在尝试使用 Horizo​​ntalScrollView 使用下面显示的布局制作可滚动的水平菜单。菜单可使用上一个/下一个箭头按钮或在弹跳时滚动。当 Horizo​​ntalScrollView 到达一端时,我希望隐藏同一端的箭头(在下图中,我希望隐藏左箭头)。

如何检测到 Horizo​​ntalScrollView 已经结束?

谢谢

在此处输入图像描述

<RelativeLayout android:background="@drawable/bg_home_menu"
    android:layout_width="fill_parent" android:layout_height="45dp">
    <ImageView android:id="@+id/previous" android:src="@drawable/arrow_l"
        android:layout_height="14dp" android:layout_width="10dp"
        android:layout_alignParentLeft="true"
        android:layout_centerVertical="true" />

    <ImageView android:id="@+id/next" android:src="@drawable/arrow_r"
        android:layout_height="14dp" android:layout_width="10dp"
        android:layout_alignParentRight="true"
        android:layout_centerVertical="true" />

    <HorizontalScrollView android:id="@+id/horizontalScroll"
        android:layout_width="fill_parent" android:layout_height="fill_parent"
        android:scrollbars="none" android:fadingEdgeLength="30dp" android:layout_toLeftOf="@id/next"
        android:layout_toRightOf="@id/previous" >

        <LinearLayout android:id="@+id/home_menu"
            android:orientation="horizontal" android:layout_width="wrap_content"
            android:layout_height="fill_parent" android:gravity="center_vertical">

            <Button android:id="@+id/btn_home" android:background="@drawable/btn_home_menu_on"
                android:layout_height="35dp" android:layout_width="wrap_content" android:focusable="true"
                android_clickable="false" android:text="@string/menu_home" android:textColor="#FFFFFF" android:tag="-1"/>

            <!-- More are added dynamically -->

        </LinearLayout>

    </HorizontalScrollView>
</RelativeLayout>
4

2 回答 2

4

Horizo​​ntalScrollView 没有滚动监听器。您可以做的是向其添加一个 OnTouchListener 这将在用户滚动时连续触发,并且每次您可以使用返回 int 的方法 getScrollX。

现在 0 表示它的最左边,要找到最右边(最大滚动量),您需要找到水平滚动视图的子视图的宽度。这是通过使用 addOnGlobalLayoutListener 找到的,否则 onCreate 方法中的宽度将始终为 0

将此代码放在 onCreate 方法中

final HorizontalScrollView hs = (HorizontalScrollView)findViewById(R.id.scroll);

ViewTreeObserver vto = hs.getViewTreeObserver(); 
vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() { 
    @Override 
    public void onGlobalLayout() { 
        hs.getViewTreeObserver().removeGlobalOnLayoutListener(this); 
        maxScrollX = hs.getChildAt(0) 
                .getMeasuredWidth()-getWindowManager().getDefaultDisplay().getWidth();

    } 
});        

hs.setOnTouchListener(new OnTouchListener() {           
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        Log.e("ScrollValue", Integer.toString(hs.getScrollX()));
  if(hs.getScrollX() == maxScrollX){
      Log.e("MaxRight", "MaxRight");    
  }
  return false;
    }
});
于 2011-10-06T09:16:36.670 回答
3

使用滚动条内 LinearLayout 的getScrollX()来确定屏幕上的最左角。如果为 0,则应禁用左箭头。

对于右箭头,检索绘图矩形的宽度,添加 getScrollX() 并将其与getMeasuredWidth ()进行比较,如果相同,则您在右侧,不需要右箭头。

因此,您的代码将如下所示:

if (homeMenu.getScrollX()==0) {
  hideLeftArrow();
} else {
  showLeftArrow();
}
if (homeMenu.getDrawingRect().right == homeMenu.getMeasuredWidth()) {
  hideRightArrow();
} else {
  showRightArrow();
}

当然,您必须将其放入事件侦听器中。我只能考虑使用您自己的 Horizo​​ntalScrollView 类,并覆盖 onScroll() 方法来执行上述检查,请参阅这篇文章

于 2011-10-06T09:53:22.683 回答