我正在尝试使用HorizontalScrollView使用下面显示的布局制作可滚动的水平菜单。菜单可使用上一个/下一个箭头按钮或在投掷时滚动。当HorizontalScrollView到达一端时,我希望隐藏同一端的箭头(在下面显示的图像中,我希望隐藏左箭头)。
如何检测HorizontalScrollView已到达结束?
由于
<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>
答案 0 :(得分:4)
HorizontalScrollView没有滚动侦听器。你可以做的是向它添加一个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;
}
});
答案 1 :(得分:3)
使用滚动条内的LinearLayout的getScrollX()来确定哪个是屏幕上最左边的角落。如果为0,则应禁用左箭头。
对于右箭头,检索drawing rectangle的宽度,添加getScrollX()并将其与getMeasuredWidth ()进行比较,如果相同,则右侧,不需要右侧箭头。
所以你的代码看起来像这样:
if (homeMenu.getScrollX()==0) {
hideLeftArrow();
} else {
showLeftArrow();
}
if (homeMenu.getDrawingRect().right == homeMenu.getMeasuredWidth()) {
hideRightArrow();
} else {
showRightArrow();
}
当然,你必须把它放在一个事件监听器中。我只能考虑使用您自己的HorizontalScrollView类,并覆盖onScroll()方法来执行上述检查,请参阅this post。