Android开发ImageView控件缩放图片
首先还是最基础的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控件缩放图片的更多相关文章
- Android:ImageView控件显示图片
1)android显示图片可以使用imageView来呈现,而且也可以通过ImageButton来实现给button添加图片. 2)在创建一个ImageView后,显示图片绑定元素是:android: ...
- CAD控件,CAD插件使用教程:Android开发使用控件--开发环境的搭建
Android开发使用控件入门--环境搭建 2014-12-24 09:57 14人阅读 评论(0) 收藏 编辑 删除 CAD控件.CAD三维控件,手机 ...
- Android开发使用控件入门--环境搭建
Android开发使用控件入门--环境搭建 软件名称(,梦,,想.CAD ,控件) 1. 环境搭建: 3 1.1. 安装Eclipse 3 1.2. 下载JDK 3 1.3. 下载Android S ...
- Android天坑ImageView控件上下留白原因与解决
ImageView控件上下留白 如下,误以为是padding的问题.搜索无果 后来发现是需要添加android:adjustViewBounds="true",调整ImageVie ...
- Android开发CheckBox控件,全选,反选,取消全选
在Android开发中我们经常会使用CheckBox控件,那么怎么实现CheckBox控件的全选,反选呢 首先布局我们的界面: <?xml version="1.0" enc ...
- android 开发 ScrollView 控件的一些api描述与自定义ScrollView接口回调方法
1.正常使用ScrollView控件的一些api详解. package com.example.lenovo.mydemoapp.scrollViewDemo; import android.supp ...
- android 开发-设置控件/view的水平方向翻转
设置控件沿着水平方向翻转(即Y轴180°) 看效果: 代码: <pl.droidsonroids.gif.GifImageView android:id="@+id/gv_image1 ...
- 【Android开发】控件外边框自定义
1.在drawable里面新建自定义的资源文件shape <?xml version="1.0" encoding="utf-8"?> <sh ...
- 从零开始学android开发-获取控件
mBtnNews = (Button)findViewById(R.id.btn_news);//获取控件
随机推荐
- 如何禁用easyui-linkbutton 中的Click事件
eg: <a id="btn" href="#" class="easyui-linkbutton" data-options=&qu ...
- 深入了解jquery中的键盘事件
很多时候,我们需要获取用户的键盘事件,下面就一起来看看jquery是如何操作键盘事件的. 一.首先需要知道的是: 1.keydown() keydown事件会在键盘按下时触发. 2.keyup() k ...
- javascript取url参数的几种方法
//获取QueryString的数组 function getQueryString() { var result = location.search.match(new RegExp("[ ...
- windows 基础及基本软件测试环境搭建
- 从文章"避免复制与粘贴"到文章"Extract Method"的反思(1)
看了一个比我牛的人的博客园的博文"避免复制和粘贴".里面提到了重构手法Extract Method. 所以又搜了一下Extract Method. 这里先自我理解Extract ...
- Java实现Http服务器(三)
下面重点介绍上篇文章介绍的HttpServerImpl类当中的ServerImpl类 sun.net.httpserver.ServerImpl 600行左右的类,是整个HttpServer的核心 ...
- Hive的MoveTask错误
最近在部署Hive上线,结果在线上线下同时出现了MoveTask报错的现象,虽然两者错误的日志以及错误信息一样,但是经过分析解决又发现两者的原因是不一样的. 首先线下的错误日志: 2015-05-18 ...
- 设计模式之(三)Proxy模式
今天学习Proxy模式.代理模式是在对已有对象操作困难或者不太方便时,选择用代理的方式对对象进行访问.Proxy实现的方法必须和被代理对象一致. 举一个简单的例子, 有一个Math类实现了IMath接 ...
- 几种交换两个数函数(swap函数)的写法和解析
#include <iostream> using namespace std; /*值传递,局部变量a和b的值确实在调用swap0时变化了,当结束时,他们绳命周期结束*/ void sw ...
- 遍历、显示ftp下的文件夹和文件信息
今天做了通过ftp读取ftp根目录下的所有文件夹和文件,嵌套文件夹查询,总共用到了一下代码: 1.FtpFile_Directory package com.hs.dts.web.ftp; impor ...