• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >Android > Android多点触控技术,实现对图片的放大缩小平移,惯性滑动等功能

Android多点触控技术,实现对图片的放大缩小平移,惯性滑动等功能

作者:网友 字体:[增加 减小] 来源:互联网 时间:2017-05-26

网友通过本文主要向大家介绍了android 多点触控,android多点触控事件,android多点触摸,多点触控,电容屏 多点触控等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

Android多点触控技术,实现对图片的放大缩小平移,惯性滑动等功能


首先推荐一下鸿洋大大的打造个性的图片预览与多点触控视频教程,这套教程教我们一步一步实现了多点触控实现对图片的平移和缩放的功能,这篇文章我将在鸿洋大大的基础之上做了一些扩展功能:
1.图片的惯性滑动
2.图片缩放小于正常比例时,松手会自动回弹成正常比例
3.图片缩放大于最大比例时,松手会自动回弹成最大比例

这里写图片描述

实现图片的缩放,平移,双击缩放等基本功能的代码如下,每一行代码我都做了详细的注释<喎?http://www.Bkjia.com/kf/ware/vc/" target="_blank" class="keylink">vcD4NCjxwcmUgY2xhc3M9"brush:java;"> public class ZoomImageView extends ImageView implements ScaleGestureDetector.OnScaleGestureListener, View.OnTouchListener , ViewTreeObserver.OnGlobalLayoutListener{ /** * 缩放手势的监测 */ private ScaleGestureDetector mScaleGestureDetector; /** * 监听手势 */ private GestureDetector mGestureDetector; /** * 对图片进行缩放平移的Matrix */ private Matrix mScaleMatrix; /** * 第一次加载图片时调整图片缩放比例,使图片的宽或者高充满屏幕 */ private boolean mFirst; /** * 图片的初始化比例 */ private float mInitScale; /** * 图片的最大比例 */ private float mMaxScale; /** * 双击图片放大的比例 */ private float mMidScale; /** * 是否正在自动放大或者缩小 */ private boolean isAutoScale; //----------------------------------------------- /** * 上一次触控点的数量 */ private int mLastPointerCount; /** * 是否可以拖动 */ private boolean isCanDrag; /** * 上一次滑动的x和y坐标 */ private float mLastX; private float mLastY; /** * 可滑动的临界值 */ private int mTouchSlop; /** * 是否用检查左右边界 */ private boolean isCheckLeftAndRight; /** * 是否用检查上下边界 */ private boolean isCheckTopAndBottom; public ZoomImageView(Context context) { this(context, null, 0); } public ZoomImageView(Context context, AttributeSet attrs) { this(context, attrs, 0); } public ZoomImageView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); //一定要将图片的ScaleType设置成Matrix类型的 setScaleType(ScaleType.MATRIX); //初始化缩放手势监听器 mScaleGestureDetector = new ScaleGestureDetector(context,this); //初始化矩阵 mScaleMatrix = new Matrix(); setOnTouchListener(this); mTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop(); //初始化手势检测器,监听双击事件 mGestureDetector = new GestureDetector(context,new GestureDetector.SimpleOnGestureListener(){ @Override public boolean onDoubleTap(MotionEvent e) { //如果是正在自动缩放,则直接返回,不进行处理 if (isAutoScale) return true; //得到点击的坐标 float x = e.getX(); float y = e.getY(); //如果当前图片的缩放值小于指定的双击缩放值 if (getScale() < mMidScale){ //进行自动放大 post(new AutoScaleRunnable(mMidScale,x,y)); }else{ //当前图片的缩放值大于初试缩放值,则自动缩小 post(new AutoScaleRunnable(mInitScale,x,y)); } return true; } }); } /** * 当view添加到window时调用,早于onGlobalLayout,因此可以在这里注册监听器 */ @Override protected void onAttachedToWindow() { super.onAttachedToWindow(); getViewTreeObserver().addOnGlobalLayoutListener(this); } /** * 当view从window上移除时调用,因此可以在这里移除监听器 */ @Override protected void onDetachedFromWindow() { super.onDetachedFromWindow(); getViewTreeObserver().removeGlobalOnLayoutListener(this); } /** * 当布局树发生变化时会调用此方法,我们可以在此方法中获得控件的宽和高 */ @Override public void onGlobalLayout() { //只有当第一次加载图片的时候才会进行初始化,用一个变量mFirst控制 if (!mFirst){ mFirst = true; //得到控件的宽和高 int width = getWidth(); int height = getHeight(); //得到当前ImageView中加载的图片 Drawable d = getDrawable(); if(d == null){//如果没有图片,则直接返回 return; } //得到当前图片的宽和高,图片的宽和高不一定等于控件的宽和高 //因此我们需要将图片的宽和高与控件宽和高进行判断 //将图片完整的显示在屏幕中 int dw = d.getIntrinsicWidth(); int dh = d.getIntrinsicHeight(); //我们定义一个临时变量,根据图片与控件的宽高比例,来确定这个最终缩放值 float scale = 1.0f; //如果图片宽度大于控件宽度,图片高度小于控件高度 if (dw>width && dhheight){ //我们就应该将图片的高度缩小,缩小至控件的高度,计算方法同上 scale = height * 1.0f / dh; } //如果图片的宽度小于控件宽度,高度小于控件高度时,我们应该将图片放大 //比如图片宽度是控件宽度的1/2 ,图片高度是控件高度的1/4 //如果我们将图片放大4倍,则图片的高度是和控件高度一样了,但是图片宽度就超出控件宽度了 //因此我们应该选择一个最小值,那就是将图片放大2倍,此时图片宽度等于控件宽度 //同理,如果图片宽度大于控件宽度,图片高度大于控件高度,我们应该将图片缩小 //缩小的倍数也应该为那个最小值 if ((dw < width && dh < height) || (dw > width && dh > height)){ scale = Math.min(width * 1.0f / dw , height * 1.0f / dh); } //我们还应该对图片进行平移操作,将图片移动到屏幕的居中位置 //控件宽度的一半减去图片宽度的一半即为图片需要水平移动的距离 //高度同理,大家可以画个图看一看 int dx = width/2 - dw/2; int dy = height/2 - dh/2; //对图片进行平移,dx和dy分别表示水平和竖直移动的距离 mScaleMatrix.postTranslate(dx, dy); //对图片进行缩放,scale为缩放的比例,后两个参数为缩放的中心点 mScaleMatrix.postScale(scale, scale, width / 2, height / 2); //将矩阵作用于我们的图片上,图片真正得到了平移和缩放 setImageMatrix(mScaleMatrix); //初始化一下我们的几个缩放的边界值 mInitScale = scale; //最大比例为初始比例的4倍 mMaxScale = mInitScale * 4; //双击放大比例为初始化比例的2倍 mMidScale = mInitScale * 2; } } /** * 获得图片当前的缩放比例值 */ private float getScale(){ //Matrix为一个3*3的矩阵,一共9个值 float[] values = new float[9]; //将Matrix的9个值映射到values数组中 mScaleMatrix.getValues(values); //拿到Matrix中的MSCALE_X的值,这个值为图片宽度的缩放比例,因为图片高度 //的缩放比例和宽度的缩放比例一致,我们取一个就可以了 //我们还可以 return values[Matrix.MSCALE_Y]; return values[Matrix.MSCALE_X]; } /** * 获得缩放后图片的上下左右坐标以及宽高 */ private RectF getMatrixRectF(){ //获得当钱图片的矩阵 Matrix matrix = mScaleMatrix; //创建一个浮点类型的矩形 RectF rectF = new RectF(); //得到当前的图片 Drawable d = getDrawable(); if (d != null){ //使这个矩形的宽和高同当前图片一致 rectF.set(0,0,d.getIntrinsicWidth(),d.getIntrinsicHeight()); //将矩阵映射到矩形上面,之后我们可以通过获取到矩阵的上下左右坐标以及宽高 //来得到缩放后图片的上下左右坐标和宽高 matrix.mapRect(rectF); } retu

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • Android多点触控技术,实现对图片的放大缩小平移,惯性滑动等功能

相关文章

  • 2017-05-26Linux内核系列—8.操作系统开发之时钟中断,linux内核
  • 2017-05-26Android--JNI简单的实例解析
  • 2017-05-26Looper.prepare()和Looper.loop(),looper.prepare
  • 2017-05-221.7 界面原型设计
  • 2017-05-26Android捕获崩溃异常,Android捕获崩溃
  • 2017-05-26Android开发3:Intent、Bundle的使用和ListView的应用 、RelativeLayout(相对布局)简述(简单通讯录的实现),relativelayout
  • 2017-05-26UI-初识君面之理论篇,ui-初识理论篇
  • 2017-05-26nagios二次开发之“依据分组绘制服务图”
  • 2017-05-26Android的消息机制,Android消息机制
  • 2017-05-26kvm性能优化

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • Android 5.0(包含5.0以下版本) 获取栈顶应用程序包名,android包名
    • Android--根据子控件的大小自动换行的ViewGroup,android--viewgroup
    • Android中Intent在Activity之间传递对象[Serializable或Parcelable]
    • x11vnc无法识别大写状态键的解决方法
    • android studio java.io.IOException:setDataSourse fail.,androidctsfail
    • android TextView实现跑马灯效果
    • RadioButton与CheckBox,radiobutton
    • Android点击跳转到淘宝的某一商品详情页或者某一店铺页面,android商品详情
    • Android WebView File域同源策略绕过漏洞浅析
    • Android开发学习——搭建开发环境,android搭建

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有