Android:ImageView图片缩放、居中

来源:互联网 发布:php pop3发送邮件 编辑:程序博客网 时间:2024/05/19 14:00

几个重要知识点:

1、布局文件中android:scaleType="matrix" 设置图片动态缩放

2、matrix.postTranslate(dx,dy); 平移图片 matrix.postScale(sx,sy,p.x,p.y); 缩放图片

3、两点的中点、距离计算方式,限制缩放范围函数,在指定区域内移动图片方法

(以下代码网上很多地方有类似的,仅供参考)

[java] view plaincopy
  1. public class Main extends Activity  
  2. {  
  3.     private static final int NONE = 0;  
  4.     private static final int DRAG = 1;  
  5.     private static final int ZOOM = 2;  
  6.   
  7.     private int mode = NONE;  
  8.     private float oldDist;  
  9.     private Matrix matrix = new Matrix();  
  10.     private Matrix savedMatrix = new Matrix();  
  11.     private PointF start = new PointF();  
  12.     private PointF mid = new PointF();  
  13.       
  14.     ImageView view;  
  15.     Bitmap bitmap;  
  16.     DisplayMetrics dm;  
  17.     float minScaleR=0.1f;  //最少缩放比例  
  18.     static final float MAX_SCALE = 4f; //最大缩放比例  
  19.     float dist = 1f;  
  20.   
  21.     @Override  
  22.     public void onCreate(Bundle savedInstanceState)  
  23.     {  
  24.         super.onCreate(savedInstanceState);  
  25.         setContentView(R.layout.main);  
  26.         view = (ImageView) findViewById(R.id.image_view);  
  27.         bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.test);  
  28.           
  29.         dm = new DisplayMetrics();  
  30.         getWindowManager().getDefaultDisplay().getMetrics(dm); //获取分辨率  
  31.           
  32.           
  33.         matrix.setScale(minScaleR, minScaleR); //开始先缩小  
  34.         matrix.postTranslate(120120);     //图片的位置相对于imageview的左上角往右往下各偏移120个像素  
  35.         view.setImageMatrix(matrix);  
  36.           
  37.         view.setOnTouchListener(new OnTouchListener()  
  38.         {  
  39.             @Override  
  40.             public boolean onTouch(View v, MotionEvent event)  
  41.             {  
  42.                 ImageView view = (ImageView) v;  
  43.                 switch (event.getAction() & MotionEvent.ACTION_MASK)  
  44.                 {  
  45.                 case MotionEvent.ACTION_DOWN:  //单点  
  46.                     Toast.makeText(Main.this, bitmap.getWidth()+"*"+bitmap.getHeight(), Toast.LENGTH_LONG).show();  
  47.                     savedMatrix.set(matrix);  
  48.                     start.set(event.getX(), event.getY());  
  49.                     mode = DRAG;  
  50.                     break;  
  51.                 case MotionEvent.ACTION_UP:  //单点弹起  
  52.                 case MotionEvent.ACTION_POINTER_UP:  //多点弹起  
  53.                     mode = NONE;  
  54.                     break;  
  55.                 case MotionEvent.ACTION_POINTER_DOWN:  //多点  
  56.                     oldDist = spacing(event);  
  57.                     if (oldDist > 10f)  
  58.                     {  
  59.                         savedMatrix.set(matrix);  
  60.                         midPoint(mid, event);  
  61.                         mode = ZOOM;  
  62.                     }  
  63.                     break;  
  64.                 case MotionEvent.ACTION_MOVE: //按下且在拖动  
  65.                     if (mode == DRAG)  
  66.                     {  
  67.                         matrix.set(savedMatrix);  
  68.                         matrix.postTranslate(event.getX() - start.x,event.getY() - start.y);  //xy方向都可以拖动  
  69.                         //matrix.postTranslate(event.getX() - start.x,0); //只在x轴方向拖动 即左右拖动  上下不动  
  70.                         //matrix.postTranslate(0,event.getY() - start.y);  //只在y轴方向拖动 即上下拖动  左右不动  
  71.                     }  
  72.                     else if (mode == ZOOM)  
  73.                     {  
  74.                         float newDist = spacing(event);  
  75.                         if (newDist > 10f)  
  76.                         {  
  77.                             matrix.set(savedMatrix);  
  78.                             float scale = newDist / oldDist;  
  79.                             matrix.postScale(scale, scale, mid.x, mid.y);  
  80.                         }  
  81.                     }  
  82.                     break;  
  83.                 }  
  84.                   
  85.                 view.setImageMatrix(matrix);  
  86.                   
  87.                 CheckScale();  //限制缩放范围  
  88.                 center();  //居中控制  
  89.                   
  90.                 return true;  
  91.             }  
  92.   
  93.               
  94.             //两点的距离  
  95.             private float spacing(MotionEvent event)  
  96.             {  
  97.                 float x = event.getX(0) - event.getX(1);  
  98.                 float y = event.getY(0) - event.getY(1);  
  99.                 return FloatMath.sqrt(x * x + y * y);  
  100.             }  
  101.               
  102.             //两点的中点  
  103.             private void midPoint(PointF point, MotionEvent event)  
  104.             {  
  105.                 float x = event.getX(0) + event.getX(1);  
  106.                 float y = event.getY(0) + event.getY(1);  
  107.                 point.set(x / 2, y / 2);  
  108.             }  
  109.         });  
  110.     }  
  111.       
  112.     //限制最大最小缩放比例    
  113.     protected void CheckScale()  
  114.     {  
  115.         float p[] = new float[9];  
  116.         matrix.getValues(p);  
  117.         if (mode == ZOOM)  
  118.         {  
  119.             if (p[0] < minScaleR)  
  120.             {  
  121.                 matrix.setScale(minScaleR, minScaleR);  
  122.             }  
  123.             if (p[0] > MAX_SCALE)  
  124.             {  
  125.                 matrix.set(savedMatrix);  
  126.             }  
  127.         }  
  128.     }  
  129.   
  130.     //自动居中  左右及上下都居中  
  131.     protected void center()  
  132.     {  
  133.         center(true,true);  
  134.     }  
  135.   
  136.     private void center(boolean horizontal, boolean vertical)  
  137.     {  
  138.         Matrix m = new Matrix();  
  139.         m.set(matrix);  
  140.         RectF rect = new RectF(00, bitmap.getWidth(), bitmap.getHeight());  
  141.         m.mapRect(rect);  
  142.         float height = rect.height();  
  143.         float width = rect.width();  
  144.         float deltaX = 0, deltaY = 0;  
  145.         if (vertical)  
  146.         {  
  147.             //int screenHeight = dm.heightPixels;  //手机屏幕分辨率的高度  
  148.             int screenHeight = 400;  
  149.             if (height < screenHeight)  
  150.             {  
  151.                 deltaY = (screenHeight - height)/2 - rect.top;  
  152.             }else if (rect.top > 0)  
  153.             {  
  154.                 deltaY = -rect.top;  
  155.             }else if (rect.bottom < screenHeight)  
  156.             {  
  157.                 deltaY = view.getHeight() - rect.bottom;  
  158.             }  
  159.         }  
  160.           
  161.         if (horizontal)  
  162.         {  
  163.             //int screenWidth = dm.widthPixels;  //手机屏幕分辨率的宽度  
  164.             int screenWidth = 400;  
  165.             if (width < screenWidth)  
  166.             {  
  167.                 deltaX = (screenWidth - width)/2 - rect.left;  
  168.             }else if (rect.left > 0)  
  169.             {  
  170.                 deltaX = -rect.left;      
  171.             }else if (rect.right < screenWidth)  
  172.             {  
  173.                 deltaX = screenWidth - rect.right;  
  174.             }  
  175.         }  
  176.         matrix.postTranslate(deltaX, deltaY);  
  177.     }  
  178. }  
[html] view plaincopy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <RelativeLayout  
  3.     xmlns:android="http://schemas.android.com/apk/res/android"  
  4.     android:layout_width="fill_parent"  
  5.     android:layout_height="fill_parent"  
  6.     >  
  7.     <ImageView  
  8.         android:layout_width="200dip"  
  9.         android:layout_height="200dip"  
  10.         android:layout_centerHorizontal="true"  
  11.         android:layout_centerVertical="true"  
  12.         android:scaleType="matrix"  
  13.         android:src="@drawable/test"  
  14.         android:id="@+id/image_view">  
  15.     </ImageView>  
  16. </RelativeLayout>  

 

1 0