我的编程空间,编程开发者的网络收藏夹
学习永远不晚

android Matrix实现图片随意放大缩小或拖动

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

android Matrix实现图片随意放大缩小或拖动

本文实例为大家分享了android Matrix图片随意放大缩小和拖动的具体代码,供大家参考,具体内容如下

step1:新建一个项目DragAndZoom,并准备一张照片放在res/drawable-hdpi目录下,如下图所示:

step2: 设置应用的UI界面,在main.xml中设置:


<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
 android:orientation="vertical" 
 android:layout_width="fill_parent" 
 android:layout_height="fill_parent" 
 > 
<ImageView 
 android:layout_width="fill_parent" 
 android:layout_height="wrap_content" 
 android:class="lazy" data-src="@drawable/wall" 
 android:id="@+id/imageView" 
 android:scaleType="matrix" 
 /> <!-- 指定为matrix类型 --> 
</LinearLayout> 

step3:MainActivity.java中实现具体的需求


package cn.roco.drag; 
import android.app.Activity; 
import android.graphics.Matrix; 
import android.graphics.PointF; 
import android.os.Bundle; 
import android.util.FloatMath; 
import android.view.MotionEvent; 
import android.view.View; 
import android.view.View.OnTouchListener; 
import android.widget.ImageView; 
public class MainActivity extends Activity { 
 private ImageView imageView; 
 @Override 
 public void onCreate(Bundle savedInstanceState) { 
 super.onCreate(savedInstanceState); 
 setContentView(R.layout.main); 
 imageView = (ImageView) this.findViewById(R.id.imageView); 
 imageView.setOnTouchListener(new TouchListener()); 
 } 
 private final class TouchListener implements OnTouchListener { 
  
 private int mode = 0;// 初始状态 
  
 private static final int MODE_DRAG = 1; 
  
 private static final int MODE_ZOOM = 2; 
  
 private PointF startPoint = new PointF(); 
  
 private Matrix matrix = new Matrix(); 
  
 private Matrix currentMatrix = new Matrix(); 
  
 private float startDis; 
  
 private PointF midPoint; 
 @Override 
 public boolean onTouch(View v, MotionEvent event) { 
   
  switch (event.getAction() & MotionEvent.ACTION_MASK) { 
  // 手指压下屏幕 
  case MotionEvent.ACTION_DOWN: 
  mode = MODE_DRAG; 
  // 记录ImageView当前的移动位置 
  currentMatrix.set(imageView.getImageMatrix()); 
  startPoint.set(event.getX(), event.getY()); 
  break; 
  // 手指在屏幕上移动,改事件会被不断触发 
  case MotionEvent.ACTION_MOVE: 
  // 拖拉图片 
  if (mode == MODE_DRAG) { 
   float dx = event.getX() - startPoint.x; // 得到x轴的移动距离 
   float dy = event.getY() - startPoint.y; // 得到x轴的移动距离 
   // 在没有移动之前的位置上进行移动 
   matrix.set(currentMatrix); 
   matrix.postTranslate(dx, dy); 
  } 
  // 放大缩小图片 
  else if (mode == MODE_ZOOM) { 
   float endDis = distance(event);// 结束距离 
   if (endDis > 10f) { // 两个手指并拢在一起的时候像素大于10 
   float scale = endDis / startDis;// 得到缩放倍数 
   matrix.set(currentMatrix); 
   matrix.postScale(scale, scale,midPoint.x,midPoint.y); 
   } 
  } 
  break; 
  // 手指离开屏幕 
  case MotionEvent.ACTION_UP: 
  // 当触点离开屏幕,但是屏幕上还有触点(手指) 
  case MotionEvent.ACTION_POINTER_UP: 
  mode = 0; 
  break; 
  // 当屏幕上已经有触点(手指),再有一个触点压下屏幕 
  case MotionEvent.ACTION_POINTER_DOWN: 
  mode = MODE_ZOOM; 
   
  startDis = distance(event); 
   
  if (startDis > 10f) { // 两个手指并拢在一起的时候像素大于10 
   midPoint = mid(event); 
   //记录当前ImageView的缩放倍数 
   currentMatrix.set(imageView.getImageMatrix()); 
  } 
  break; 
  } 
  imageView.setImageMatrix(matrix); 
  return true; 
 } 
  
 private 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); 
 } 
  
 private PointF mid(MotionEvent event) { 
  float midX = (event.getX(1) + event.getX(0)) / 2; 
  float midY = (event.getY(1) + event.getY(0)) / 2; 
  return new PointF(midX, midY); 
 } 
 } 
} 

step4:AndroidMainfest.xml


<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
 package="cn.roco.drag" 
 android:versionCode="1" 
 android:versionName="1.0"> 
 <uses-sdk android:minSdkVersion="8" /> 
 <application android:icon="@drawable/icon" android:label="@string/app_name"> 
 <activity android:name=".MainActivity" 
   android:label="@string/app_name"> 
  <intent-filter> 
  <action android:name="android.intent.action.MAIN" /> 
  <category android:name="android.intent.category.LAUNCHER" /> 
  </intent-filter> 
 </activity> 
 </application> 
</manifest> 

step5:具体的效果图


上面两个是图片拖拽的效果,而图片的缩放效果要在真机中才能够看得到,请读者自己在真机环境中测试。

附注:具体的程序源码在:下载程序源码

其实通过通过手势也可以缩放图片  左--->右 放大 右 --->左 缩小 速度越快,缩放比例越大

zoom.xml


<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
 android:orientation="vertical" 
 android:layout_width="fill_parent" 
 android:layout_height="fill_parent" 
 > 
<ImageView 
 android:layout_width="fill_parent" 
 android:layout_height="wrap_content" 
 android:class="lazy" data-src="@drawable/wall" 
 android:id="@+id/show" 
 android:scaleType="matrix" 
 /> <!-- 指定为matrix类型 --> 
</LinearLayout> 

GestureZoom.java


package cn.roco.gesture; 
import android.app.Activity; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.graphics.Matrix; 
import android.graphics.drawable.BitmapDrawable; 
import android.os.Bundle; 
import android.view.GestureDetector; 
import android.view.GestureDetector.OnGestureListener; 
import android.view.MotionEvent; 
import android.widget.ImageView; 
 
public class GestureZoom extends Activity implements OnGestureListener { 
 // 定义手势检测器实例 
 GestureDetector detector; 
 ImageView imageView; 
 // 初始化图片资源 
 Bitmap bitmap; 
 // 定义图片的高和宽 
 int width, height; 
 // 记录当前的缩放比 
 float currentScale = 1; 
 // 控制图片缩放的Matrix对象 
 Matrix matrix; 
 @Override 
 protected void onCreate(Bundle savedInstanceState) { 
 super.onCreate(savedInstanceState); 
 setContentView(R.layout.zoom); 
 // 创建手势检测器 
 detector = new GestureDetector(this); 
 imageView = (ImageView) findViewById(R.id.show); 
 matrix = new Matrix(); 
 // 获取被缩放的源图片 
 bitmap = BitmapFactory.decodeResource(this.getResources(), 
  R.drawable.wall); 
 // 获得位图的宽 
 width = bitmap.getWidth(); 
 // 获得位图的高 
 height = bitmap.getHeight(); 
 // 设置 ImageView初始化显示的图片 
 imageView.setImageBitmap(BitmapFactory.decodeResource( 
  this.getResources(), R.drawable.wall)); 
 } 
 @Override 
 public boolean onTouchEvent(MotionEvent event) { 
 // 将该Activity上的触碰时间交个 GestureDetector处理 
 return detector.onTouchEvent(event); 
 } 
 @Override 
 public boolean onDown(MotionEvent e) { 
 // TODO Auto-generated method stub 
 return false; 
 } 
 @Override 
 public void onShowPress(MotionEvent e) { 
 // TODO Auto-generated method stub 
 } 
 @Override 
 public boolean onSingleTapUp(MotionEvent e) { 
 return false; 
 } 
 @Override 
 public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, 
  float distanceY) { 
 return false; 
 } 
 @Override 
 public void onLongPress(MotionEvent e) { 
 } 
 @Override 
 public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, 
  float velocityY) { 
 velocityX = velocityX > 4000 ? 4000 : velocityX; 
 velocityY = velocityY < -4000 ? -4000 : velocityY; 
 // 感觉手势的速度来计算缩放比,如果 velocityX>0,放大图像,否则缩小图像 
 currentScale += currentScale * velocityX / 4000.0f; 
 // 保证 currentScale 不会等于0 
 currentScale = currentScale > 0.01 ? currentScale : 0.01f; 
 // 重置 Matrix 
 matrix.setScale(currentScale, currentScale, 160, 200); 
 BitmapDrawable tmp = (BitmapDrawable) imageView.getDrawable(); 
 // 如果图片还未回收,先强制收回该图片 
 if (!tmp.getBitmap().isRecycled()) { 
  tmp.getBitmap().recycle(); 
 } 
 // 根据原始位图和 Matrix创建新图片 
 Bitmap bitmap2 = Bitmap.createBitmap(bitmap, 0, 0, width, height, 
  matrix, true); 
 //显示新的位图 
 imageView.setImageBitmap(bitmap2); 
 return true; 
 } 
} 

查看一下运行的效果

    

您可能感兴趣的文章:android 添加随意拖动的桌面悬浮窗口Android 仿淘宝、京东商品详情页向上拖动查看图文详情控件DEMO详解Android 可拖动的seekbar自定义进度值Android编程之控件可拖动的实现方法android 应用内部悬浮可拖动按钮简单实现代码Android实现ImageView图片缩放和拖动Android编程实现图标拖动效果的方法Android实现跟随手指拖动并自动贴边的View样式(实例demo)Android自定义View实现拖动选择按钮Android使用ViewDragHelper实现QQ聊天气泡拖动效果


免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

android Matrix实现图片随意放大缩小或拖动

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

android Matrix实现图片随意放大缩小或拖动

本文实例为大家分享了android Matrix图片随意放大缩小和拖动的具体代码,供大家参考,具体内容如下 step1:新建一个项目DragAndZoom,并准备一张照片放在res/drawable-hdpi目录下,如下图所示:step2:
2022-06-06

Android实现ImageView图片缩放和拖动

今天我们来编写一个缩放效果的ImageView ,网上有很多人都讲了这些。但有许多人都直接使用了库文件, 那么我们今天做的是直接上代码编写一个拖动和缩放的ImageView,具体看效果图那么简单了分析一下。在手机上缩放图片和拖动要用到什么手
2022-06-06

android 大图片拖拽并缩放实现原理

由于最近项目忙,博客一直没有时间更新,今天有点时间就连续更新两篇吧,过过瘾。 这篇图片拖拽缩放也是我在项目中用到的,今天整理一下,将源码奉献给大家,希望对大家以后碰到相似的问题有帮助。 这篇就不做过多介绍了,直接上源码: 代码如下:publ
2022-06-06

Android手势滑动实现ImageView缩放图片大小

本文推出了两种Android手势实现ImageView缩放图片大小的方法,分享给大家供大家参考,具体内容如下 方法一: 将以下代码写到MulitPointTouchListener.java中,然后对你相应的图片进行OnTouchListe
2022-06-06

Android实现ImageView图片双击放大及缩小

本文实例介绍了Android实现ImageView图片双击放大及缩小的相关技巧,分享给大家供大家参考,具体内容如下public class DoubleScaleImageView extends ImageView implements
2022-06-06

Android实现旋转,放大,缩小图片的方法

本文实例讲述了Android实现旋转,放大,缩小图片的方法。分享给大家供大家参考,具体如下: 项目中需要做到一个预览图片的功能 最初设想自定义个一个view,在onDraw中用的是生成新的Bitmap,来放大,缩小 但由于手机内存是有限制的
2022-06-06

Android实现手势滑动多点触摸放大缩小图片效果

网上文章虽多,但是这种效果少之又少,我真诚的献上以供大家参考 实现原理:自定义ImageView对此控件进行相应的layout(动态布局). 这里你要明白几个方法执行的流程: 首先ImageView是继承自View的子类. onLayout
2022-06-06

Android实现图片反转、翻转、旋转、放大和缩小

**********************************************************************android 实现图片的翻转***********************************
2022-06-06

Android编程实现图片的浏览、缩放、拖动和自动居中效果

本文实例讲述了Android编程实现图片的浏览、缩放、拖动和自动居中效果的方法。分享给大家供大家参考,具体如下: Touch.java public class Touch extends Act
2022-06-06

Android实现通过手势控制图片大小缩放的方法

本文实例讲述了Android实现通过手势控制图片大小缩放的方法。分享给大家供大家参考,具体如下: 该程序实现的是通过手势来缩放图片,从左向右挥动图片时图片被放大,从右向左挥动图片时图片被缩小,挥动速度越快,缩放比越大。程序思路如下:在界面中
2022-06-06

Vue 图片监听鼠标滑轮滚动实现图片缩小放大功能(实现思路)

其实想要实现功能很简单,就是在一张图片上监听鼠标滑轮滚动的事件,然后根据上滚还是下滚实现图片的缩放,这篇文章主要介绍了Vue 实现图片监听鼠标滑轮滚动实现图片缩小放大功能,需要的朋友可以参考下
2023-05-13

Android编程实现图片放大缩小功能ZoomControls控件用法实例

本文实例讲述了Android编程实现图片放大缩小功能ZoomControls控件用法。分享给大家供大家参考,具体如下:MainActivity代码:package example.com.myapplication;import andro
2023-05-30

Android通过自定义ImageView控件实现图片的缩放和拖动的实现代码

概述:通过自定义ImageView控件,在xml布局里面调用自定的组件实现图片的缩放。 public class
2022-06-06

Vue图片监听鼠标滑轮滚动怎么实现图片缩小放大功能

这篇文章主要讲解了“Vue图片监听鼠标滑轮滚动怎么实现图片缩小放大功能”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Vue图片监听鼠标滑轮滚动怎么实现图片缩小放大功能”吧!效果:实现思路在j
2023-07-05

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

文章将在原有基础之上做了一些扩展功能: 1.图片的惯性滑动 2.图片缩放小于正常比例时,松手会自动回弹成正常比例 3.图片缩放大于最大比例时,松手会自动回弹成最大比例实现图片的缩放,平移,双击缩放等基本功能的代码如下,每一行代码我都做了
2022-06-06

Android App中实现可以双击放大和缩小图片功能的实例

先来看一个很简单的核心图片缩放方法:public static Bitmap scale(Bitmap bitmap, float scaleWidth, float scaleHeight) { int width = bitmap.ge
2022-06-06

编程热搜

  • Android:VolumeShaper
    VolumeShaper(支持版本改一下,minsdkversion:26,android8.0(api26)进一步学习对声音的编辑,可以让音频的声音有变化的播放 VolumeShaper.Configuration的三个参数 durati
    Android:VolumeShaper
  • Android崩溃异常捕获方法
    开发中最让人头疼的是应用突然爆炸,然后跳回到桌面。而且我们常常不知道这种状况会何时出现,在应用调试阶段还好,还可以通过调试工具的日志查看错误出现在哪里。但平时使用的时候给你闹崩溃,那你就欲哭无泪了。 那么今天主要讲一下如何去捕捉系统出现的U
    Android崩溃异常捕获方法
  • android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
    系统的设置–>电池–>使用情况中,统计的能耗的使用情况也是以power_profile.xml的value作为基础参数的1、我的手机中power_profile.xml的内容: HTC t328w代码如下:
    android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
  • Android SQLite数据库基本操作方法
    程序的最主要的功能在于对数据进行操作,通过对数据进行操作来实现某个功能。而数据库就是很重要的一个方面的,Android中内置了小巧轻便,功能却很强的一个数据库–SQLite数据库。那么就来看一下在Android程序中怎么去操作SQLite数
    Android SQLite数据库基本操作方法
  • ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
    工作的时候为了方便直接打开编辑文件,一些常用的软件或者文件我们会放在桌面,但是在ubuntu20.04下直接直接拖拽文件到桌面根本没有效果,在进入桌面后发现软件列表中的软件只能收藏到面板,无法复制到桌面使用,不知道为什么会这样,似乎并不是很
    ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
  • android获取当前手机号示例程序
    代码如下: public String getLocalNumber() { TelephonyManager tManager =
    android获取当前手机号示例程序
  • Android音视频开发(三)TextureView
    简介 TextureView与SurfaceView类似,可用于显示视频或OpenGL场景。 与SurfaceView的区别 SurfaceView不能使用变换和缩放等操作,不能叠加(Overlay)两个SurfaceView。 Textu
    Android音视频开发(三)TextureView
  • android获取屏幕高度和宽度的实现方法
    本文实例讲述了android获取屏幕高度和宽度的实现方法。分享给大家供大家参考。具体分析如下: 我们需要获取Android手机或Pad的屏幕的物理尺寸,以便于界面的设计或是其他功能的实现。下面就介绍讲一讲如何获取屏幕的物理尺寸 下面的代码即
    android获取屏幕高度和宽度的实现方法
  • Android自定义popupwindow实例代码
    先来看看效果图:一、布局
  • Android第一次实验
    一、实验原理 1.1实验目标 编程实现用户名与密码的存储与调用。 1.2实验要求 设计用户登录界面、登录成功界面、用户注册界面,用户注册时,将其用户名、密码保存到SharedPreference中,登录时输入用户名、密码,读取SharedP
    Android第一次实验

目录