首先还是最基础的ImageView控件如何显示图片:

<ImageView
                Android:id="@+id/imgView"
                android:layout_width="fill_parent"
                android:layout_height="fill_parent"
                android:src="@drawable/ic_prepicture"
                android:scaleType="matrix"
                />

以上布局中xml的代码主要是scaleType的设置,决定了图片初始显示的状态,ImageView.ScaleType设置图解 这篇文章可以清楚的看到每个参数的效果。

这里我们主要用matrix这个效果实现缩放,一定要设置scaleType为Matrix,才能实现相应的效果,也可以在代码中imgView.setScaleType(ScaleType.MATRIX);如此设置。

直奔主题

第一步:了解操作对象(Matrix)以及操作方式(平移和缩放)

1,    ImageView控件有getImageMatrix,setImageMatrix这两个函数获取/设置其像素矩阵Matrix;(这个就是我们要操作的对象)

2.1 矩阵Matrix又有如下的函数1:postTranslate(double dx, double dy)可以实现矩阵平移(dx, dy)它的API说明是:Postconcats the matrix with the specified translation. M' = T(dx, dy) * M。

2.2 函数2:postScale(float sx, float sy, float px, float py)  可以实现矩阵水平/垂直方向缩放sx,sy;同时控制缩放的中心点(px, py)API说明:Postconcats the matrix with the specified scale. M' = S(sx, sy, px, py) * M

第二步:了解如何获取平移参数值(dx, dy)以及缩放参数值(sx, sy, centerPoint.x, centerPoint.y)

对于Android开发来说,这样的实现应该很简单,只是一个OnTouchListener类的实现,重写public boolean onTouch(View v, MotionEvent event) 函数,其中平移是单指,缩放是多指

1, switch(event.getAction() & MotionEvent.ACTION_MASK),与MotionEvent.ACTION_MASK做与运算主要是为了多指消息的识别,不然不能响应多指。

2, 平移情况:比较简单,直接在ACTION_MOVE实现中计算dx, dy(event.getX(), event.getY());

3, 缩放情况:需要计算两个手指之间的距离dis1, dis2, 这样scale = dis2/dis1; 同时还要算出两个手指的中心点,作为缩放的中心点。

4,再次理一下思路:当出发Down的消息(手指按下)时候,记录初始点的状态;当响应Move的时候,将当前状态与初始状态作比较,做平移或者缩放的操作;当up的时候,初始化状态。

第三步,通过前面的赘述,直接上代码:

@Override
 public boolean onTouch(View v, MotionEvent event) {
  // TODO Auto-generated method stub
  switch(event.getAction() & MotionEvent.ACTION_MASK)
  {
  //单指按下
  case MotionEvent.ACTION_DOWN:
  {
      mMode = DRAGMODE;
      mStarPt.set(event.getX(), event.getY());
      mCurrMatrix = mImageView.getImageMatrix();
      
      break;
  }
  //多指缩放的按下
  case MotionEvent.ACTION_POINTER_DOWN:
  {
   mMode = ZOOMMODE;
   mStarDis = GetDistance(event);
   mMidPt  = GetMidPt(event);
   mCurrMatrix = mImageView.getImageMatrix();
   break;
  }
  //移动
  case MotionEvent.ACTION_MOVE:
  {
   if(mMode == DRAGMODE)
   {
    float left = 0, top = 0, right = 0, bottom = 0;
    float dx = event.getX() - mStarPt.x;
    float dy = event.getY() - mStarPt.y;
    
    mMatrix.set(mCurrMatrix);
    mMatrix.postTranslate(dx, dy);
    mStarPt.set(event.getX(), event.getY());
   }
   else if(mMode == ZOOMMODE)
   {
    float endDis = GetDistance(event);
    if (endDis > 10f)
    {
     float fScale = endDis /mStarDis;
     mMatrix.set(mCurrMatrix);
     
     mMatrix.postScale(fScale, fScale, mMidPt.x, mMidPt.y);
     //注意加上这一句,否则缩放为数量级了
     mStarDis = endDis;
    }
   }
   mImageView.setImageMatrix(mMatrix);
   break;
  }
  //单指抬起
  case MotionEvent.ACTION_UP:
  //多指抬起
  case MotionEvent.ACTION_POINTER_UP:
  {
   mMode = 0;
   break;
  }
  
  }
  
  return true;
 }

以下是全局变量的定义:

private ImageView mImageView;
 private int mMode;    //模式:1-拉动;2-缩放
 final private int DRAGMODE = 1;
 final private int ZOOMMODE = 2;
 
 private PointF  mStarPt = new PointF();
 private float    mStarDis;
 private PointF  mMidPt = new PointF();
 
 private Matrix mMatrix = new Matrix();
 private Matrix mCurrMatrix = new Matrix();

这样就实现了简单的缩放和平移操作了,代码思路还是参考了网上的一些博客文章。
 
但是,这样还是有一个问题,就是缩放的限制,不能无限大,也不能无限小,平移也需要定义范围内的平移。下一章就要讲如何实现图片浏览器中的效果。到时再将整体代码贴上来。

Android开发ImageView控件缩放图片的更多相关文章

  1. Android:ImageView控件显示图片

    1)android显示图片可以使用imageView来呈现,而且也可以通过ImageButton来实现给button添加图片. 2)在创建一个ImageView后,显示图片绑定元素是:android: ...

  2. CAD控件,CAD插件使用教程:Android开发使用控件--开发环境的搭建

    Android开发使用控件入门--环境搭建 2014-12-24 09:57     14人阅读     评论(0)     收藏         编辑     删除 CAD控件.CAD三维控件,手机 ...

  3. Android开发使用控件入门--环境搭建

    Android开发使用控件入门--环境搭建 软件名称(,梦,,想.CAD  ,控件) 1. 环境搭建: 3 1.1. 安装Eclipse 3 1.2. 下载JDK 3 1.3. 下载Android S ...

  4. Android天坑ImageView控件上下留白原因与解决

    ImageView控件上下留白 如下,误以为是padding的问题.搜索无果 后来发现是需要添加android:adjustViewBounds="true",调整ImageVie ...

  5. Android开发CheckBox控件,全选,反选,取消全选

    在Android开发中我们经常会使用CheckBox控件,那么怎么实现CheckBox控件的全选,反选呢 首先布局我们的界面: <?xml version="1.0" enc ...

  6. android 开发 ScrollView 控件的一些api描述与自定义ScrollView接口回调方法

    1.正常使用ScrollView控件的一些api详解. package com.example.lenovo.mydemoapp.scrollViewDemo; import android.supp ...

  7. android 开发-设置控件/view的水平方向翻转

    设置控件沿着水平方向翻转(即Y轴180°) 看效果: 代码: <pl.droidsonroids.gif.GifImageView android:id="@+id/gv_image1 ...

  8. 【Android开发】控件外边框自定义

    1.在drawable里面新建自定义的资源文件shape <?xml version="1.0" encoding="utf-8"?> <sh ...

  9. 从零开始学android开发-获取控件

    mBtnNews = (Button)findViewById(R.id.btn_news);//获取控件

随机推荐

  1. 如何在一个网站或者一个页面,去书写你的JS代码

    // JavaScript Document //如何在一个网站或者一个页面,去书写你的JS代码: //1.js的分层(功能) : jquery(tools) 组件(ui) 应用(app), mvc( ...

  2. 中文版Chrome浏览器不支持12px以下字体的解决方案

    中文版Chrome浏览器不支持12px以下字体的解决方案 Chrome 27之前的中文版桌面浏览器会默认设定页面的最小字号是12px,英文版则没有限制,主要是因为chrome认为汉字小于12px就会增 ...

  3. MySQL配置文件路径及‘The total number of locks exceeds the lock table size’问题

    在删除mysql中的数据时,遇到报错: ERROR 1206 (HY000): The total number of locks exceeds the lock table size 查了查,发现 ...

  4. Java控制台版推箱子

    import java.util.Scanner; public class b { public static void main(String[] args) { Scanner input = ...

  5. 12个Icon图标资源网站

    1.除了Icon以外,还有很多不错的UI设计素材. 地址:http://worldui.com/2.除了免费Icon资源下载以外,还提供Icon定制的付费服务.地址:http://dryicons.c ...

  6. IE8,IE9,IE10绿色版,以及ColorPix

    对于开发者而言IETest是一坨屎. 但是我们终于迎来的蛋糕和火腿,今天无意间发现了竟然有绿色版的浏览器版本,IE9,IE10已经下到本地,IE8网传是有的,但是没有找到合适的版本.但是足够了,本机使 ...

  7. 支付宝集成SDK 报错

    1.打开Demo中的错误 这是路径错误导致 解决办法:在Build Settings 中找到 Library Search Paths ,去掉其中的 /// 2.自己集成支付宝SDK时的错误 这个也是 ...

  8. Tomcat启动分析(Tomcat7.0)

    1)bin目录下的bootstrap.jar中的main方法启动Tomcat org.apache.catalina.startup.Bootstrap类下的main方法 可以看到Bootstrap类 ...

  9. 在objc项目中使用常量的最佳实践

    在objc项目中使用常量的最佳实践   之前,在在objc项目中使用常量中,使用c的预处理#define来设置常量.比如,可以做个头文件,然后在需要的类文件中import,使用常量. 但这不是最佳实践 ...

  10. 【测试】解决loadrunner11无法运行负载测试

    问题: LoadRunner11版,录制完脚本,准备运行时提示‘ loadrunner controller 无法创建 vuser 确保您的 load generator ’, 脚本已经录好,但是运行 ...