我已经坚持了一段时间,尽管我找到了解决方法,但我不太了解为什么它起作用,我应该正确地实现它!那里的ZoomButtonsController上似乎也缺少信息。
在这里的其他文章中,我已经在我的应用程序中实现了“滑动”手势功能。但是,我也希望单击一下以编程方式显示缩放按钮。我已经有用于此ScrollView的基于GestureDetector的OnTouchListener,所以我也为其添加了一个ZoomButtonsController作为OnZoomListener(以及用于处理onSingleTapConfirmed和其他此类代码的代码)。
一切正常-直到出现缩放按钮。从那时起(假设可见性始终保持不变),即使缩放按钮消失,手势也不会起作用,甚至无法轻按!当屏幕上显示缩放按钮时,您可以单击它们,并且滚动仍然可以正常进行,但是手势消失了。
我终于想出了一个“解决方案”:如果OnZoomListener.onVisibilityChanged()触发为不可见,我将调用myScrollView的setOnTouchListener()来还原gestureListener(就像我在onCreate()中所做的那样)。手势再次正常工作。
编辑:如果在onVisibilityChanged()触发可见时执行此操作,则手势会立即起作用,但会禁用缩放按钮,因此效果并不理想!两者都很好...
那么,我在使用ZoomButtonsController的正确方法是正确的吗?如果没有,那是什么?更重要的是,为什么当出现缩放按钮时它们似乎可以永久替代我的OnTouchListener? ZoomButtonsController是否应该在触发后劫持当前手势?这比它(监听器的某些常规属性)更基本吗?
最佳答案
在找到解决方案之前,我已经为这个问题苦苦挣扎了一段时间。我不确定这是否是最正确的,但功能是否正常。
概念:
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);
最后,您只需要将侦听器添加到zoom小部件即可:
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
}
};
祝好运,
路易斯