制作Android Zoom Buttons控制器和GestureDetector相处融洽

时间:2011-09-26 13:02:41

标签: android button zoom listener gesture

我已经坚持了一段时间了,虽然我发现了一种解决方法,但我并不完全理解为什么它的工作原理我应该来实现它正确!在那里似乎还缺少关于ZoomButtonsController的信息。

此处的其他文章,我已在我的应用中实现了“滑动”手势功能。但是,在单击时,我还希望以编程方式显示缩放按钮。我已经为这个ScrollView提供了基于GestureDetector的OnTouchListener,所以我也为它添加了一个ZoomButtonsController作为OnZoomListener(以及处理onSingleTapConfirmed和其他类似事物的代码)。

事情很好 - 直到变焦按钮出现。从那时起(假设持续可见性),即使在变焦按钮逐渐消失之后,也没有手势工作,甚至没有敲击!您可以在屏幕上点击缩放按钮,滚动仍然可以正常工作,但手势已经消失。

我终于提出了一个“修复”:如果OnZoomListener.onVisibilityChanged()触发不可见,我调用myScrollView的setOnTouchListener()来恢复gestureListener(就像我在onCreate()中所做的那样)。手势再次正常工作。

编辑:如果你在onVisibilityChanged()触发可见时执行此操作,你可以立即使用手势但它会禁用缩放按钮,所以它不是那么棒!两个人都很高兴......

那么,我正在以正确的方式使用ZoomButtonsController,如果没有,那是什么?更重要的是,为什么当缩放按钮出现时它们似乎永久地替换了我的OnTouchListener? ZoomButtonsController 应该劫持当前触发后的手势?这是否比那更基本(听众的一些一般属性)?

1 个答案:

答案 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
    }
};
祝你好运, 路易斯