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

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

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

android:orientation="vertical"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

>

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:src="@drawable/wall"

android:id="@+id/imageView"

android:scaleType="matrix"

/>

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) {

/** 通过与运算保留最后八位 MotionEvent.ACTION_MASK = 255 */

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

package="cn.roco.drag"

android:versionCode="1"

android:versionName="1.0">

android:label="@string/app_name">

step5:具体的效果图

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

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

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

zoom.xml

android:orientation="vertical"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

>

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:src="@drawable/wall"

android:id="@+id/show"

android:scaleType="matrix"

/>

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 Matrix实现图片随意放大缩小或拖动相关推荐

  1. android 图片自动裁剪图片大小,android调用原生图片裁剪后图片尺寸缩放的解决方法...

    在安卓开发中,如果对拍照后的图片进行图片裁剪,如果是调用系统的裁剪,如下: /* * 裁剪图片 */ private void cropPhoto() { Intent intent = new In ...

  2. android相册和拍照并裁剪图片大小,Android 拍照并对照片进行裁剪和压缩实例详解...

    Android 拍照并对照片进行裁剪和压缩实例详解 本文主要介绍 Android 调用摄像头拍照并对照片进行裁剪和压缩,文中给出了主要步骤和关键代码. 调用摄像头拍照,对拍摄照片进行裁剪,代码如下. ...

  3. android页面设置背景图片大小,android页面设置background为图片后,页面滑动掉帧问题...

    最近接手的一个android项目里面,有个viewpager+3个fragment的页面,就是很常见的可以左右滑动切换页面的那种布局.接手的时候告诉我,这个页面有卡顿现象,性能需要优化.一开始觉得是f ...

  4. android+怎么分享图片大小,Android微信分享图片大于32k进行压缩

    微信分享视频的时候,需要传一个图片数组,大小不能大于32k. 解决方案:使用Bitmap自带的compress方法解决了这个问题. 源码如下: package com.example.test; im ...

  5. android textview设置图片大小,修改Textview内图片文字间距和图片大小

    1-1 布局 对于上面的这种布局,我们一般采用的一个ViewGroup嵌入一个ImageView和一个TextView.如下所示: android:id="@+id/layout_quest ...

  6. Android全局修改字体大小,Android 仿微信全局字体大小调整

    image 目录 一.前言 二.效果预览 三.实现步骤 1.自定义字体调整控件 2.滑动按钮改变当前页面预览字体大小 3.返回时,保存放大倍数并重启应用 4.初始化应用时配置字体放大倍数. 四.Dem ...

  7. android webview缩放功能,在Android WebView中启用/禁用缩放

    千万里不及你 在为客户开发Android应用程序时,我们遇到了同样的问题,我设法绕过了这一限制.我查看了WebView类的Android源代码,发现了updateZoomButtonsEnabled( ...

  8. android 推送图标大小,Android状态栏图标大小 – 使用Cordova / Phonegap推送插件

    我正在使用Ionic(Cordova AngularJS)开发 Android应用程序.有了它,我使用推送插件( https://github.com/phonegap-build/PushPlugi ...

  9. android 手势放缩_手把手教你打造支持手势放大缩小的ImageView

    写在前面 最近有了新的任务,学习的时间比以前少了不少,Java回炉的文估计是得缓缓了,不过每周一篇尽量保质保量.最近感觉我文写的有点不好,因为我写东西除非必要,不然概念性的东西我基本上都是一笔带过-- ...

最新文章

  1. MySQL数据库分组和聚合函数组合使用
  2. Oracle中,使 CREATE TABLE AS SELECT 支持ORDER BY
  3. Docker 底层实现
  4. JDK7与JDK8中HashMap的实现
  5. easyui datagrid
  6. 字符串中最长无重复子串(O(n))
  7. 【无线也安全】屏蔽蹭网一族
  8. 用图片搜索图片的几个好网站
  9. CSS网页切图经验与要点
  10. ubuntu中的坑——Ubuntu中一些常用的软件和火狐浏览器插件的安装
  11. zuc算法代码详解_ZUC算法-信息安全工程师知识点
  12. Windows 7下手动搭建Asp和PHP集成环境
  13. 计算机网络管理员中级试题及解析,计算机网络管理员中级考试题及答案(一)(1)...
  14. 中文 Uncode 编码范围
  15. 当百度与重庆相遇,李彦宏的AI越过山丘?
  16. Win10下Windows徽标键快捷键大全
  17. 山东省农商行计算机真题,2018山东农商行招聘考试题库:计算机试题三
  18. amigo3.1 android版本,【金立E8评测】amigo OS 3.1体验再升级_金立 E8_手机评测-中关村在线...
  19. 我的MBTI 职业性格分析报告——ISFP型
  20. 七牛云刷新缓存(cdn刷新)

热门文章

  1. 【转】从零开始 LaTeX 快速入门
  2. 用Python解读最值得期待的春节档影片是......
  3. 学习SQL Server推荐的10本书
  4. chrome 书签 文件夹_将Chrome书签工具栏文件夹转换为图标
  5. 中国技术开放日专场在美国旧金山隆重开幕
  6. 1013: 求两点间距离 C语言
  7. 开孔底孔(螺纹孔、自攻孔)
  8. iconfont平台如何上传和下载字体图标
  9. Android P property属性权限添加
  10. 滴滴自动驾驶:仿真,我们是这么做的