覆盖Photoview的单击

我有一个ImageView内的一个视图页面的顶部的ActionBar。 我希望能够单击来隐藏操作栏,并且还希望能够缩放和平移每个ImageView。

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

为了实现捏缩放和平移每个ImageView我使用PhotoView库项目 。

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

parent.requestDisallowInterceptTouchEvent(true); 

我不知道怎样才能同时实现这两个function。 这似乎是唯一的解决scheme是创build我自己的捏变焦ImageView自己来控制触摸事件。

Solutions Collecting From Web of "覆盖Photoview的单击"

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

要在当前的Fragment / Activity中创buildPhotoViewAttacher,需要实现PhotoViewAttacher.OnViewTapListener,创buildattachment,

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

并添加以下function,

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

资源

你将不得不重写PhotoView库本身。 如果您查看源代码, PhotoViewAttacher类是处理onTouch事件的类。

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

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