覆盖Photoview的单击

时间:2013-12-31 15:49:11

标签: java android

我在视图寻呼机内部有一个ImageView,顶部有一个ActionBar。我希望能够单击以隐藏操作栏,我还希望能够在每个ImageView上进行缩放和平移。

要实现单击以隐藏操作栏,我有一个隐藏它的简单OnClickListener。

要在每个ImageView上实现捏缩放和平移,我使用的是PhotoView Library Project

我遇到了问题,因为只有一个触摸事件监听器可以与ImageView关联,并且实现PhotoView库项目会覆盖我的OnClickListener以隐藏ActionBar,

parent.requestDisallowInterceptTouchEvent(true);

我不确定如何同时实施两者。似乎唯一的解决方案是创建我自己的Pinch Zoom ImageView以便自己控制触摸事件。

2 个答案:

答案 0 :(得分:19)

发现PhotoView库实际上允许我为PhotoViewAttacher对象设置onViewTap,这正是我想要的。

要在当前的片段/活动中创建PhotoViewAttacher,让它实现PhotoViewAttacher.OnViewTapListener,创建attacher,

PhotoViewAttacher mAttacher = new PhotoViewAttacher(imageView);
mAttacher.setOnViewTapListener(this);

并添加以下功能

public void onViewTap(View view, float x, float y) {
    // your code here
}

Source

答案 1 :(得分:1)

您必须覆盖PhotoView库本身。如果查看源代码,PhotoViewAttacher类就是处理onTouch事件的类。

您必须在代码的这一部分(特别是ACTION_DOWN)事件中添加您正在寻找的特殊功能:

@Override
    public final boolean onTouch(View v, MotionEvent ev) {
        boolean handled = false;

        if (mZoomEnabled && hasDrawable((ImageView) v)) {
            ViewParent parent = v.getParent();
            switch (ev.getAction()) {
                case ACTION_DOWN:
                    // First, disable the Parent from intercepting the touch
                    // event
                    if (null != parent)
                        parent.requestDisallowInterceptTouchEvent(true);
                    else
                        Log.i(LOG_TAG, "onTouch getParent() returned null");

                    // If we're flinging, and the user presses down, cancel
                    // fling
                    cancelFling();
                    break;

                case ACTION_CANCEL:
                case ACTION_UP:
                    // If the user has zoomed less than min scale, zoom back
                    // to min scale
                    if (getScale() < mMinScale) {
                        RectF rect = getDisplayRect();
                        if (null != rect) {
                            v.post(new AnimatedZoomRunnable(getScale(), mMinScale,
                                    rect.centerX(), rect.centerY()));
                            handled = true;
                        }
                    }
                    break;
            }

            // Check to see if the user double tapped
            if (null != mGestureDetector && mGestureDetector.onTouchEvent(ev)) {
                handled = true;
            }

            if (!handled && null != parent) {
                parent.requestDisallowInterceptTouchEvent(false);
            }

            // Finally, try the Scale/Drag detector
            if (null != mScaleDragDetector
                    && mScaleDragDetector.onTouchEvent(ev)) {
                handled = true;
            }
        }

        return handled;
    }