android viewpager 缩放,android – ViewPager&ImageView缩放问题

是的,我也碰到过与TouchImageView相同的问题.

当我的观点得到关注时,我解决了这个问题,我所做的是禁用了ViewPager.

public class EnableDisableViewPager extends ViewPager {

private boolean enabled = true;

public EnableDisableViewPager(Context context,AttributeSet attrs) {

super(context,attrs);

}

@Override

public boolean onInterceptTouchEvent(MotionEvent arg0) {

if(enabled)

return super.onInterceptTouchEvent(arg0);

return false;

}

public boolean isEnabled() {

return enabled;

}

public void setEnabled(boolean enabled) {

this.enabled = enabled;

}

}

所以在TouchImageView中实现你的监听器来触发一个事件,无论是放大还是拖动.

将侦听器设置为您的Activity中的视图对象.所以当这些事件发生时,只是禁用视图寻呼机.

注意:您还需要一个鼠标向上的事件来启用查看器.

EDITED

这将仅适用于缩放,因此ViewPager可以滑动您应该缩小到原始页面的页面.

将这些代码添加到您的TouchImageView

public class TouchImageView extends ImageView {

...

private TouchEventListener touchEventListener;

private void sharedConstructing(Context context) {

...

setOnTouchListener(new OnTouchListener() {

@Override

public boolean onTouch(View v,MotionEvent event) {

...

case MotionEvent.ACTION_UP:

...

if(touchEventListener != null)

{

if(saveScale == 1.0)

touchEventListener.onZoomToOriginal();

else

touchEventListener.onZoom();

}

break;

...

}

...

}

});

}

...

public TouchEventListener getTouchEventListener() {

return touchEventListener;

}

public void setTouchEventListener(TouchEventListener touchEventListener) {

this.touchEventListener = touchEventListener;

}

public interface TouchEventListener

{

void onZoom();

void onZoomToOriginal();

}

}

更好的解决方案

我们可以通过使用下面给出的方法将ViewPager扩展到新的类来实现.

requestDisallowInterceptTouchEvent(true);

与此同时,我们可以滑动,而不会缩小到原始位置,我们在Gallery和许多其他应用程序中看到.

public class TouchImageView extends ImageView {

...

private void stopInterceptEvent()

{

getParent().requestDisallowInterceptTouchEvent(true);

}

private void startInterceptEvent()

{

getParent().requestDisallowInterceptTouchEvent(false);

}

private void sharedConstructing(Context context) {

super.setClickable(true);

this.context = context;

mScaleDetector = new ScaleGestureDetector(context,new ScaleListener());

matrix.setTranslate(1f,1f);

m = new float[9];

setImageMatrix(matrix);

setScaleType(ScaleType.MATRIX);

setOnTouchListener(new OnTouchListener() {

@Override

public boolean onTouch(View v,MotionEvent event) {

mScaleDetector.onTouchEvent(event);

matrix.getValues(m);

float x = m[Matrix.MTRANS_X];

float y = m[Matrix.MTRANS_Y];

PointF curr = new PointF(event.getX(),event.getY());

switch (event.getAction()) {

case MotionEvent.ACTION_DOWN:

last.set(event.getX(),event.getY());

start.set(last);

mode = DRAG;

stopInterceptEvent();

break;

case MotionEvent.ACTION_MOVE:

if (mode == DRAG) {

float deltaX = curr.x - last.x;

float deltaY = curr.y - last.y;

float scaleWidth = Math.round(origWidth * saveScale);

float scaleHeight = Math.round(origHeight * saveScale);

if (scaleWidth < width) {

deltaX = 0;

if (y + deltaY > 0)

deltaY = -y;

else if (y + deltaY < -bottom)

deltaY = -(y + bottom);

} else if (scaleHeight < height) {

deltaY = 0;

if (x + deltaX > 0)

deltaX = -x;

else if (x + deltaX < -right)

deltaX = -(x + right);

} else {

if (x + deltaX > 0)

deltaX = -x;

else if (x + deltaX < -right)

deltaX = -(x + right);

if (y + deltaY > 0)

deltaY = -y;

else if (y + deltaY < -bottom)

deltaY = -(y + bottom);

}

if(deltaX == 0)

startInterceptEvent();

else

stopInterceptEvent();

matrix.postTranslate(deltaX,deltaY);

last.set(curr.x,curr.y);

}

break;

case MotionEvent.ACTION_UP:

mode = NONE;

int xDiff = (int) Math.abs(curr.x - start.x);

int yDiff = (int) Math.abs(curr.y - start.y);

if (xDiff < CLICK && yDiff < CLICK)

performClick();

startInterceptEvent();

break;

case MotionEvent.ACTION_POINTER_UP:

mode = NONE;

break;

}

setImageMatrix(matrix);

invalidate();

return true; // indicate event was handled

}

});

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值