示例


原图:


android的图片放大功能 android 图片放大查看_android的图片放大功能

 



拖动查看其他部分:


 


android的图片放大功能 android 图片放大查看_触点_02

 



android的图片放大功能 android 图片放大查看_android的图片放大功能_03

 

 



放大仔细查看


android的图片放大功能 android 图片放大查看_触点_04


  



代码示例,注释比较详细,其他不多讲了


package com.study.drascale; 
 
import android.os.Bundle; 
 
import .Activity; 
 
import android.graphics.Matrix; 
 
import android.graphics.PointF; 
 
import android.util.FloatMath; 
 
import android.view.MotionEvent; 
 
import android.view.View; 
 
import android.view.View.OnTouchListener; 
 
import android.widget.ImageView; 
 
public class MainActivity extends Activity { 
 
ImageView imageView; 
 
    @Override 
 
    public void onCreate(Bundle savedInstanceState) { 
 
        super.onCreate(savedInstanceState); 
 
        setContentView(R.layout.main); 
 
         
 
        imageView = (ImageView) findViewById(R.id.img); 
 
        imageView.setOnTouchListener(new TounchListener()); 
 
    } 
 
    private class TounchListener implements OnTouchListener{ 
 
      
 
     private PointF startPoint = new PointF(); 
 
     private Matrix matrix = new Matrix(); 
 
     private Matrix currentMaritx = new Matrix(); 
 
      
 
     private int mode = 0;//用于标记模式 
 
     private static final int DRAG = 1;//拖动 
 
     private static final int ZOOM = 2;//放大 
 
     private float startDis = 0; 
 
     private PointF midPoint;//中心点 
 
  public boolean onTouch(View v, MotionEvent event) { 
 
   switch (event.getAction() & MotionEvent.ACTION_MASK) { 
 
   case MotionEvent.ACTION_DOWN: 
 
    mode = DRAG; 
 
    currentMaritx.set(imageView.getImageMatrix());//记录ImageView当期的移动位置 
 
    startPoint.set(event.getX(),event.getY());//开始点 
 
    break; 
 
   case MotionEvent.ACTION_MOVE://移动事件 
 
    if (mode == DRAG) {//图片拖动事件 
 
     float dx = event.getX() - startPoint.x;//x轴移动距离 
 
     float dy = event.getY() - startPoint.y; 
 
     matrix.set(currentMaritx);//在当前的位置基础上移动 
 
     matrix.postTranslate(dx, dy); 
 
      
 
    } else if(mode == ZOOM){//图片放大事件 
 
     float endDis = distance(event);//结束距离 
 
     if(endDis > 10f){ 
 
      float scale = endDis / startDis;//放大倍数 
 
      matrix.set(currentMaritx); 
 
      matrix.postScale(scale, scale, midPoint.x, midPoint.y); 
 
     } 
 
      
 
      
 
    } 
 
    break; 
 
     
 
   case MotionEvent.ACTION_UP: 
 
    mode = 0; 
 
    break; 
 
   //有手指离开屏幕,但屏幕还有触点(手指) 
 
   case MotionEvent.ACTION_POINTER_UP: 
 
    mode = 0; 
 
    break; 
 
   //当屏幕上已经有触点(手指),再有一个手指压下屏幕 
 
   case MotionEvent.ACTION_POINTER_DOWN: 
 
    mode = ZOOM; 
 
    startDis = distance(event); 
 
     
 
    if(startDis > 10f){//避免手指上有两个茧 
 
     midPoint = mid(event); 
 
     currentMaritx.set(imageView.getImageMatrix());//记录当前的缩放倍数 
 
    } 
 
     
 
    break; 
 

   } 
 
   imageView.setImageMatrix(matrix); 
 
   return true; 
 
  } 
 
      
 
    } 
 
    /** 
 
     * 两点之间的距离 
 
     * @param event 
 
     * @return 
 
     */ 
 
    private static float distance(MotionEvent event){ 
 
     //两根线的距离 
 
     float dx = event.getX(1) - event.getX(0); 
 
     float dy = event.getY(1) - event.getY(0); 
 
     return FloatMath.sqrt(dx*dx + dy*dy); 
 
    } 
 
    /** 
 
     * 计算两点之间中心点的距离 
 
     * @param event 
 
     * @return 
 
     */ 
 
    private static PointF mid(MotionEvent event){ 
 
     float midx = event.getX(1) + event.getX(0); 
 
     float midy = event.getY(1) - event.getY(0); 
 
      
 
     return new PointF(midx/2, midy/2); 
 
    } 
 
}