麦子学院android开发教程imageview通过matrix实现手势缩放

上传人:ji****n 文档编号:46092515 上传时间:2018-06-22 格式:DOCX 页数:7 大小:18.28KB
返回 下载 相关 举报
麦子学院android开发教程imageview通过matrix实现手势缩放_第1页
第1页 / 共7页
麦子学院android开发教程imageview通过matrix实现手势缩放_第2页
第2页 / 共7页
麦子学院android开发教程imageview通过matrix实现手势缩放_第3页
第3页 / 共7页
麦子学院android开发教程imageview通过matrix实现手势缩放_第4页
第4页 / 共7页
麦子学院android开发教程imageview通过matrix实现手势缩放_第5页
第5页 / 共7页
点击查看更多>>
资源描述

《麦子学院android开发教程imageview通过matrix实现手势缩放》由会员分享,可在线阅读,更多相关《麦子学院android开发教程imageview通过matrix实现手势缩放(7页珍藏版)》请在金锄头文库上搜索。

1、IT 在线教育平台麦子学院 http:/本文章来给各位同学介绍一下 Android 开发之 ImageView 通过 matrix 实现手势缩放操作方法,我们知道安卓中 ImageView 本身有 scaleType 属性,通过设置android:scaleType=matrix 可以用很少的代码就实现缩放功能了,下面我们来看看。关于 ImageView 的手势缩放,有很多种方法,绝大多数开源自定义缩放都是修改了ondraw 函数来实现的。但是 ImageView 本身有 scaleType 属性,通过设置android:scaleType=“matrix“ 可以用很少的代码就实现缩放功能。缩

2、放的优点是实现起来简单,同时因为没有反复调用 ondraw 函数,缩放过程中不会有闪烁现象。MATRIX 矩阵可以动态缩小放大图片来显示,缩小图片:代码如下/获得 Bitmap 的高和宽 int bmpWidth=bmp.getWidth(); int bmpHeight=bmp.getHeight(); /设置缩小比例 double scale=0.8; /计算出这次要缩小的比例 scaleWidth=(float)(scaleWidth*scale); scaleHeight=(float)(scaleHeight*scale); /产生 resize 后的 Bitmap 对象 Matri

3、x matrix=new Matrix(); matrix.postScale(scaleWidth, scaleHeight); Bitmap resizeBmp=Bitmap.createBitmap(bmp, 0, 0, bmpWidth, bmpHeight, matrix, true);下面将一个自定义的实现了手势缩放的 ImageView 代码拷贝如下:代码如下package com.jcodecraeer.stargallerry; import android.content.Context; import android.graphics.Matrix; IT 在线教育平台麦

4、子学院 http:/import android.graphics.PointF; import android.util.AttributeSet; import android.util.FloatMath; import android.view.MotionEvent; import android.widget.ImageView; public class ImageTouchView extends ImageView private PointF startPoint = new PointF(); private Matrix matrix = new Matrix(); p

5、rivate 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;/中心点 /* * 默认构造函数 * param context */public ImageTouchView(Context context) super(context); /* * 该构造方

6、法在静态引入 XML 文件中是必须的 * param context * param paramAttributeSet IT 在线教育平台麦子学院 http:/*/public ImageTouchView(Context context,AttributeSet paramAttributeSet) super(context,paramAttributeSet); public boolean onTouchEvent(MotionEvent event) startPoint.set() .ACTION DOWNswitch (event.getAction() currentMari

7、tx.set(this.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.po

8、stTranslate(dx, dy); else if(mode = ZOOM)/图片放大事件 float endDis = distance(event);/结束距离 if(endDis 10f) float scale = endDis / startDis;/放大倍数 /Log.v(“scale=“, String.valueOf(scale); matrix.set(currentMaritx); matrix.postScale(scale, scale, midPoint.x, midPoint.y); IT 在线教育平台麦子学院 http:/ break; case Motio

9、nEvent.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(this.getImageMatri

10、x();/记录当前的缩放倍数 break; this.setImageMatrix(matrix); return true; IT 在线教育平台麦子学院 http:/ * 两点之间的距离 * 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); /

11、* * 计算两点之间中心点的距离 * 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); 在 xml 中这样使用自定义的 ImageView:这里有个小细节, android:layout_width 和 android:layout_height 这里都是=“matc

12、h_parent“ ,如果我们换成 wrap_content 的话,你会发现图片只能在一个很小的区间缩放。而 match_parent 则可以很随意的在整个屏幕缩放。但是 match_parent 导致了一个让人意外的问题:如果将 imageView 的宽度和高度都设置为填充整个父控件,然后 scaleType 设置成Matrix,则图片不是居中显示的,整个图片靠上去了,这里我还没有找出原因,不过在网上找出了解决的办法:“先设置 ImageView 的 ScaleType=“CENTER“ 要给控件添加拖动与放大缩水前。再把 ScaleType 设为:“Matric“ (即 ImageView

13、 设置 OnTouchListener 前更改属性即可)”其中“ImageView 设置 OnTouchListener 前更改属性”在我们这个例子中应替换为在caseMotionEvent.ACTION_MOVE:/移动事件开始更改属性。在代码中更改 ScaleType应该这样做:this.setScaleType(ImageView.ScaleType.MATRIX);说到 ScaleType,我们看看 ImageView.ScaleType 值的意义和区别:CENTER /center 按图片的原来 size 居中显示,当图片长/宽超过 View 的长/宽,则截取图片的居中部分显示CEN

14、TER_CROP / centerCrop 按比例扩大图片的 size 居中显示,使得图片长(宽)等于或大于 View 的长(宽)CENTER_INSIDE / centerInside 将图片的内容完整居中显示,通过按比例缩小或原来的 size 使得图片长/宽等于或小于 View 的长/宽FIT_CENTER / fitCenter 把图片按比例扩大/缩小到 View 的宽度,居中显示IT 在线教育平台麦子学院 http:/FIT_END / fitEnd 把图片按比例扩大/缩小到 View 的宽度,显示在 View 的下部分位置FIT_START / fitStart 把图片按比例扩大/缩小到 View 的宽度,显示在 View 的上部分位置FIT_XY / fitXY 把图片不按比例扩大/缩小到 View 的大小显示MATRIX / matrix 用矩阵来绘制

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 医学/心理学 > 基础医学

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号