我已经坚持了一段时间,尽管我找到了解决方法,但我不太了解为什么它起作用,我应该正确地实现它!那里的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
    }
};


祝好运,
路易斯

07-26 07:33