2015-08-25 28 views
3

我有一个framelayout有一个背景图像和一些imageviews。它也有一些嵌套的布局(比如Relative)。无论如何,我试图实现的是放大/缩小和平移的能力。我使用的是手势检测和setScaleX/setScaleY和translateX/tranlsateY的方法缩放/平移framelayout有图像浏览

它确实做了部分工作,但翻译有时会将整个布局排除在屏幕之外,还有一些其他小问题。

您是否推荐一种做事方式,或者是否有我可以参考的代码?

谢谢

+0

你有没有读过这个 - https://developer.android.com/training/gestures/scale.html。 Google推荐的处理方法是缩放和平移 – Oleksandr

回答

0

丽泽了这个网址[https://github.com/sephiroth74/ImageViewZoom][1].This可以帮助你。

  1. 创建的 “Touch”

公共类触摸实现OnTouchListener {

Matrix matrix = new Matrix(); 
Matrix savedMatrix = new Matrix(); 
static final int NONE = 0; 
static final int DRAG = 1; 
static final int ZOOM = 2; 
int mode = NONE; 
PointF start = new PointF(); 
PointF mid = new PointF(); 
float oldDist = 1f; 

@Override 
public boolean onTouch(View v, MotionEvent event) { 
    ImageView view = (ImageView) v; 
    dumpEvent(event); 
    switch (event.getAction() & MotionEvent.ACTION_MASK) { 
     case MotionEvent.ACTION_DOWN: 
      savedMatrix.set(matrix); 
      start.set(event.getX(), event.getY()); 
      mode = DRAG; 
      break; 
     case MotionEvent.ACTION_POINTER_DOWN: 
      oldDist = spacing(event); 
      if (oldDist > 10f) { 
       savedMatrix.set(matrix); 
       midPoint(mid, event); 
       mode = ZOOM; 
      } 
      break; 
     case MotionEvent.ACTION_UP: 
     case MotionEvent.ACTION_POINTER_UP: 
      mode = NONE; 
      break; 
     case MotionEvent.ACTION_MOVE: 
      if (mode == DRAG) { 
       matrix.set(savedMatrix); 
       matrix.postTranslate(event.getX() - start.x, event.getY() - start.y); 
      } else if (mode == ZOOM) { 
       float newDist = spacing(event); 
       if (newDist > 10f) { 
        matrix.set(savedMatrix); 
        float scale = newDist/oldDist; 
        matrix.postScale(scale, scale, mid.x, mid.y); 
       } 
      } 
      break; 
    } 

    view.setImageMatrix(matrix); 
    return true; // indicate event was handled 
} 

/** Show an event in the LogCat view, for debugging */ 
private void dumpEvent(MotionEvent event) { 
    String names[] = { "DOWN", "UP", "MOVE", "CANCEL", "OUTSIDE", 
      "POINTER_DOWN", "POINTER_UP", "7?", "8?", "9?" }; 
    StringBuilder sb = new StringBuilder(); 
    int action = event.getAction(); 
    int actionCode = action & MotionEvent.ACTION_MASK; 
    sb.append("event ACTION_").append(names[actionCode]); 
    if (actionCode == MotionEvent.ACTION_POINTER_DOWN 
      || actionCode == MotionEvent.ACTION_POINTER_UP) { 
     sb.append("(pid ").append(
       action >> MotionEvent.ACTION_POINTER_ID_SHIFT); 
     sb.append(")"); 
    } 
    sb.append("["); 
    for (int i = 0; i < event.getPointerCount(); i++) { 
     sb.append("#").append(i); 
     sb.append("(pid ").append(event.getPointerId(i)); 
     sb.append(")=").append((int) event.getX(i)); 
     sb.append(",").append((int) event.getY(i)); 
     if (i + 1 < event.getPointerCount()) 
      sb.append(";"); 
    } 
    sb.append("]"); 
} 

/** Determine the space between the first two fingers */ 
private float spacing(MotionEvent event) { 
    float x = event.getX(0) - event.getX(1); 
    float y = event.getY(0) - event.getY(1); 
    return FloatMath.sqrt(x * x + y * y); 
} 

/** Calculate the mid point of the first two fingers */ 
private void midPoint(PointF point, MotionEvent event) { 
    float x = event.getX(0) + event.getX(1); 
    float y = event.getY(0) + event.getY(1); 
    point.set(x/2, y/2); 
}} 

2.更改您的活动类的新类如下:

FrameLayout fm =(FrameLayout)findViewById(R.id.fm); 
fm.setOnTouchListener(new Touch()); 
+0

这是缩放一个图像。我上面的问题是如果你有多个图像的布局。不放大/缩小单张图像 – Snake