我已经坚持了一段时间了,虽然我发现了一种解决方法,但我并不完全理解为什么它的工作原理我应该来实现它正确!在那里似乎还缺少关于ZoomButtonsController的信息。
此处的其他文章,我已在我的应用中实现了“滑动”手势功能。但是,在单击时,我还希望以编程方式显示缩放按钮。我已经为这个ScrollView提供了基于GestureDetector的OnTouchListener,所以我也为它添加了一个ZoomButtonsController作为OnZoomListener(以及处理onSingleTapConfirmed和其他类似事物的代码)。
事情很好 - 直到变焦按钮出现。从那时起(假设持续可见性),即使在变焦按钮逐渐消失之后,也没有手势工作,甚至没有敲击!您可以在屏幕上点击缩放按钮,滚动仍然可以正常工作,但手势已经消失。
我终于提出了一个“修复”:如果OnZoomListener.onVisibilityChanged()触发不可见,我调用myScrollView的setOnTouchListener()来恢复gestureListener(就像我在onCreate()中所做的那样)。手势再次正常工作。
编辑:如果你在onVisibilityChanged()触发可见时执行此操作,你可以立即使用手势但它会禁用缩放按钮,所以它不是那么棒!两个人都很高兴......
那么,我正在以正确的方式使用ZoomButtonsController,如果没有,那是什么?更重要的是,为什么当缩放按钮出现时它们似乎永久地替换了我的OnTouchListener? ZoomButtonsController 应该劫持当前触发后的手势?这是否比那更基本(听众的一些一般属性)?
答案 0 :(得分:2)
在我找到解决方案之前,我已经在这个问题上挣扎了一段时间。我不确定它是否是最正确的,但它运作正常。
概念:
1 - 不要将ZoomButtonsController小部件直接添加到您需要它们的视图中。 onTouch事件将发生冲突。相反,您需要将ZoomButtonsController小部件添加到新视图,并将此视图添加到要添加缩放按钮的视图所在的布局中。
2 - 添加了ZoomButtonsController的视图必须是添加到父布局的最后一个视图。这样它就会被调用,如果没有按下缩放按钮,onTouch事件就会传递给你的视图供你处理。
代码示例:
//First my view where I need the zoom buttons
imageView = new ImageView(context);
LayoutParams layoutParams = new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT);
imageView.setLayoutParams(layoutParams);
imageView.setOnTouchListener(onTouchListener);
relativeLayout.addView(imageView);
//Secondly the view where the buttons are added
View zoomView = new View(context);
LayoutParams layoutParamsZoom = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
zoomView.setLayoutParams(layoutParamsZoom);
relativeLayout.addView(zoomView);
zoomButtonsController = new ZoomButtonsController(zoomView);
zoomButtonsController.setOnZoomListener(onZoomListener);
最后,您只需要将侦听器添加到缩放小部件:
ZoomButtonsController.OnZoomListener onZoomListener = new ZoomButtonsController.OnZoomListener() {
@Override
public void onZoom(boolean zoomIn) {
Log.d(TAG, "onZoom: " + zoomIn);
if(zoomIn){
setZoom(currentZoom +1);
}else{
setZoom(currentZoom -1);
}
}
@Override
public void onVisibilityChanged(boolean visible) {
// TODO Auto-generated method stub
}
};
祝你好运,
路易斯