android - 让 Android 的 ZoomButtonsController 和 GestureDetector 相处融洽

标签 android button zooming listener gesture

我已经坚持了一段时间,虽然我找到了一个解决方法,但我不太明白为什么它有效,我应该实现它适本地!那里似乎也缺乏关于 ZoomButtonsController 的信息。

根据这里的其他文章,我在我的应用程序中实现了“滑动”手势功能。但是,只需单击一下,我还希望缩放按钮以编程方式出现。对于这个 ScrollView,我已经有了基于 GestureDetector 的 OnTouchListener,所以我也为它添加了一个 ZoomButtonsController 作为 OnZoomListener(以及处理 onSingleTapConfirmed 和其他类似事情的代码)。

一切正常 - 直到出现缩放按钮。从那时起(假设持续可见),即使在缩放按钮消失之后,手势也不起作用,甚至点击也不起作用!当缩放按钮在屏幕上时,您可以单击它们,滚动仍然可以正常工作,但手势消失了。

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

编辑:如果您在 onVisibilityChanged() 触发为可见时执行此操作,您会立即获得手势,但它会禁用缩放按钮,因此效果不是很好!两者都很好...

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

最佳答案

在找到解决方案之前,我已经为这个问题苦苦挣扎了一段时间。我不确定它是否是最正确的,但它运行完美。

概念:

1 - 不要将 ZoomButtonsController 小部件直接添加到需要它们的 View 中。 onTouch 事件将发生冲突。相反,您需要将 ZoomButtonsController 小部件添加到新 View ,并将此 View 添加到与您要将缩放按钮添加到的 View 相同的布局。

2 - 添加了 ZoomButtonsController 的 View 必须是最后添加到父布局的 View 。这样它将是第一个被调用的,如果未按下缩放按钮,onTouch 事件将传递到您的 View 以供您处理。

示例代码:

    //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
    }
};

祝你好运, 路易斯

关于android - 让 Android 的 ZoomButtonsController 和 GestureDetector 相处融洽,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7555482/

相关文章:

ios - 无法将图像加载到 ScrollView 中进行缩放和滚动

android - 如果已经运行,则阻止启动主要 Activity

javascript - 在按钮内渲染 SVG 图标?

android 网页链接的两个按钮

button - 如何在SwiftUI中更改按钮的背景颜色?

Javascript - 如何缩放背景图像

javascript - 单击 for zom 使移动图像全屏显示

php - android 在使用 json 时崩溃

java - Android 中单击按钮后如何从 GridView 中删除按钮?

android - 如何在 fragment 中绑定(bind)动态 View ?