我在视图寻呼机内部有一个ImageView,顶部有一个ActionBar。我希望能够单击以隐藏操作栏,我还希望能够在每个ImageView上进行缩放和平移。
要实现单击以隐藏操作栏,我有一个隐藏它的简单OnClickListener。
要在每个ImageView上实现捏缩放和平移,我使用的是PhotoView Library Project。
我遇到了问题,因为只有一个触摸事件监听器可以与ImageView关联,并且实现PhotoView库项目会覆盖我的OnClickListener以隐藏ActionBar,
parent.requestDisallowInterceptTouchEvent(true);
我不确定如何同时实施两者。似乎唯一的解决方案是创建我自己的Pinch Zoom ImageView以便自己控制触摸事件。
答案 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
}
答案 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;
}