前几天做项目用到相机拍照,之后能对图片进行缩放,拖拽,在此我将其单独抽取出来,后面用到时直接拿来用就行了!

效果图:

注:这里不仅能按钮缩放,还能多点触摸缩放和拖拽功能!

1.布局:

android:id="@+id/flayout_img_display"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:orientation="vertical" >

android:id="@+id/linearLayout_img_display"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:layout_gravity="center"

android:gravity="center" >

android:id="@+id/img_display"

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:paddingBottom="5.0dip"

android:paddingTop="5.0dip"

android:scaleType="matrix" />

android:id="@+id/relativeLayout1"

android:layout_width="fill_parent"

android:layout_height="wrap_content" >

android:id="@+id/btn_min"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_alignParentBottom="true"

android:layout_alignParentLeft="true"

android:enabled="false"

android:text="缩小" />

android:id="@+id/btn_out"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_alignParentBottom="true"

android:layout_alignParentRight="true"

android:text="放大" />

2.就一个类:

import android.app.Activity;

import android.content.Intent;

import android.graphics.Bitmap;

import android.graphics.BitmapFactory;

import android.graphics.Matrix;

import android.graphics.PointF;

import android.os.Bundle;

import android.util.FloatMath;

import android.util.Log;

import android.view.MotionEvent;

import android.view.View;

import android.view.View.OnClickListener;

import android.view.View.OnTouchListener;

import android.widget.Button;

import android.widget.FrameLayout;

import android.widget.ImageView;

import android.widget.LinearLayout;

/**

* 缩放图片界面

* @author ZHF

*

*/

public class MainActivity extends Activity {

public static final String TAG = "ImgDisplayActivity";

//控件声明

private Button btnZoomin, btnZoomout;

private ImageView imgDisPlay;

private LinearLayout lLayoutDisplay;

private FrameLayout fLayoutDisplay;

private Bitmap bitmap;

private int imgId = 0;

private double scale_in = 0.8;//缩小比例

private double scale_out = 1.25;//放大比例

private float scaleWidth = 1;

private float scaleHeight = 1;

//模式:0:什么都不干;1:拖拽; 2:缩放

public static final int NONE = 0;

public static final int DRAG = 1;

public static final int ZOOM = 2;

//声明触发的事件模式

private int mode = NONE;

private Matrix matrix; //矩阵

private Matrix currMatrix; //当前矩阵

private PointF starPoint;

private PointF midPoint;

private float startDistance;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

//初始化

fLayoutDisplay = (FrameLayout) findViewById(R.id.flayout_img_display);

lLayoutDisplay = (LinearLayout) findViewById(R.id.linearLayout_img_display);

imgDisPlay = (ImageView) findViewById(R.id.img_display);

btnZoomin = (Button) findViewById(R.id.btn_min);

btnZoomout = (Button) findViewById(R.id.btn_out);

matrix = new Matrix(); //保存拖拽变化

currMatrix = new Matrix();// 当前的

starPoint = new PointF();//开始点的位置

btnZoomin.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

zoomIn();

}

});

btnZoomout.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

zoomOut();//放大

}

});

imgDisPlay.setImageResource(R.drawable.img);

//给图片绑定监听器哦

imgDisPlay.setOnTouchListener(new ImageViewOnTouchListener());

}

/**放大操作**/

private void zoomOut() {

reSizeBmp(scale_out);

btnZoomin.setEnabled(true);

}

/**缩小操作**/

private void zoomIn() {

reSizeBmp(scale_in);

}

/**接收传入的缩放比例实现缩放**/

private void reSizeBmp(double scale) {

//缩放比例

scaleWidth = (float) (scaleWidth * scale);

scaleHeight = (float) (scaleHeight * scale);

Matrix matrix = new Matrix();

matrix.postScale(scaleWidth, scaleHeight); //设计缩放比例

imgDisPlay.setImageMatrix(matrix);

}

/**计算触摸实现缩放**/

final class ImageViewOnTouchListener implements OnTouchListener{

@Override

public boolean onTouch(View v, MotionEvent event) {

switch (event.getAction() & MotionEvent.ACTION_MASK) {

case MotionEvent.ACTION_DOWN: //一只手指按下

Log.i(TAG,"一只手指按下");

currMatrix.set(matrix);

starPoint.set(event.getX(), event.getY());

mode = DRAG;

break;

case MotionEvent.ACTION_POINTER_DOWN: //如果有一只手指按下屏幕,后续又有一个手指按下 // 两只手指按下

Log.i(TAG,"又有一只手指按下");

startDistance = distance(event);//记下两点的距离

Log.i(TAG, startDistance+"");

if(startDistance > 5f) { //两个手指之间的最小距离像素大于5,认为是多点触摸

mode = ZOOM;

currMatrix.set(matrix);

midPoint = getMidPoint(event); //记下两个点之间的中心点

}

break;

case MotionEvent.ACTION_MOVE:

if(mode == DRAG) { //拖拽模式

Log.i(TAG,"一只手指在拖拽");

//开始--》结束点的距离

float dx = event.getX() - starPoint.x;

float dy = event.getY() - starPoint.y;

matrix.set(currMatrix);

matrix.postTranslate(dx, dy);//移动到指定点:矩阵移动比例;eg:缩放有缩放比例

} else if(mode == ZOOM) { //缩放模式

Log.i(TAG,"正在缩放");

float distance = distance(event); //两点之间的距离

if(distance > 5f) {

matrix.set(currMatrix);

float cale = distance / startDistance;

matrix.preScale(cale, cale, midPoint.x, midPoint.y); //进行比例缩放

}

}

break;

case MotionEvent.ACTION_UP: //最后一只手指离开屏幕后触发此事件

case MotionEvent.ACTION_POINTER_UP: //一只手指离开屏幕,但还有一只手指在上面会触此事件

//什么都没做

mode = NONE;

break;

default:

break;

}

imgDisPlay.setImageMatrix(matrix);

//两只手指的缩放

return true;

}

}

/**计算两点之间的距离像素**/

private float distance(MotionEvent e) {

float eX = e.getX(1) - e.getX(0); //后面的点坐标 - 前面点的坐标

float eY = e.getY(1) - e.getY(0);

return FloatMath.sqrt(eX * eX + eY * eY);

}

/**计算两点之间的中心点**/

private PointF getMidPoint(MotionEvent event) {

float x = (event.getX(1) - event.getX(0)) / 2;

float y = (event.getY(1) - event.getY(0)) / 2;

return new PointF(x,y);

}

}

ok!主要的算法就在ImageViewOnTouchListener监听器当中,要考虑那三种情况(缩放、拖拽、什么都不干),另外需要注意的就是,单个手指和两个以上手指的情况。

android 多点触控缩放,【移动开发】Android中图片的多点触控和缩放相关推荐

  1. android jni 结构体_Android应用开发Android JNI-c/c++调用java方法

    本文将带你了解Android应用开发Android JNI-c/c++调用java方法,希望本文对大家学Android有所帮助. " Android   JNI-c/c++调用java方法, ...

  2. golang开发android的jni,用纯Golang开发Android与IOS应用

    Golang1.4就对Android开发做了些支持,1.5版本前几天好像发布了,特意看了整理下,1.5支持32位与64位的android与IOS应用开发了,当然还不是很好用,听说性能比Java做的程序 ...

  3. 基于android个性闹钟的设计与开发,Android个性闹钟计算机毕业设计答辩ppt.ppt

    基于Android的闹钟设计与开发 Logo 绪论 Contents 1 相关技术及开发平台 2 系统分析 3 系统设计 4 系统实现 5 Logo 绪论 随着移动平台的崛起 越来越多的传统PC软件被 ...

  4. android白色暗色主题,使用Kotlin开发Android应用(12) - Dark theme 暗色主题

    Dark theme 暗色主题 样式和主题 样式是一个属性集合,用于指定单个 View 的外观. 样式可以指定字体颜色.字号.背景颜色等属性. 主题背景是一种应用于整个应用.Activity 或视图层 ...

  5. android openal播放器,用 Golang 开发 Android 应用(五)—— Audio(openAL)使用-Go语言中文社区...

    计划按以下的内容更新 Audio(openAL) 使用 Audio 是很重要的部分,但我之前漏掉它了,所以最初的计划里没有相关内容,发现这个漏网之鱼后,我"上下求(sou)索"&q ...

  6. android各目录大小,Android 基础篇 — 放不同drawable文件夹中图片的大小

    我们接着上篇文章Android 基础篇 - 不同DPI取哪个本地文件夹中的资源 讲,文末尾提到一个问题,为什么不同drawable文件夹中的图片大小在终端设备会不一样? 1 准备 在drawable- ...

  7. php图片比例不失真,PHP中图片实现等比例不失真缩放

    笔者在设计http://www.cityxii.cn的主页过程中,有遇到图片缩放问题.由于页面的图片是从论坛里面抽取,而用户在论坛里面所发图片大小不一,展示出来难免会要变形. http://www.c ...

  8. Qt5:Qt中图片的翻转,旋转,缩放,扭曲操作

    具体用到了  mirror()  shear()  scaled() translate() rotate() 等函数函数等会儿再写 (其中  translate() 和 rotate() 俩函数组合 ...

  9. Android 开发 -- 开发第一个安卓程序、Android UI开发(布局的创建:相对布局和线性布局、控件单位:px pt dp sp、常用控件 、常见对话框、ListView)

    文章目录 1. 开发第一个Hello World程序 1.1 开发程序 1.2 认识程序中的文件 1.3 Android程序结构 1.4 安卓程序打包 2. Android UI开发 2.1 布局的创 ...

最新文章

  1. python中可以用中文作为变量-Python中用中文变量名、函数名,会影响性能吗?
  2. 运算符重载(c++细节篇二)
  3. [数据结构专训][GXOI/GZOI2019]旧词,[hdu5118]GRE Words Once More!,[hdu6333]Problem B. Harvest of Apples
  4. 风暴事件处理器–每个工作者的GC日志文件
  5. 使用腾讯OCR,图片转表格
  6. 5G网络什么时候普及,5G手机可以用4G的手机卡吗,5G和4G什么区别
  7. Cisco 3550配置DHCP中继代理
  8. BAJT 中高级 Java 面试题答案
  9. python编写登录接口_使用python编写一个登录接口
  10. Milne格式MATLAB,matlab考试题
  11. 搭建迁移训练Slim框架环境
  12. Surprise官方文档练习
  13. 329例精选matlab算法原理及源码详解——老生谈算法
  14. 软考初级程序员的备考经验分享
  15. 5款好用的时间管理软件推荐[2020年推荐]
  16. 一步一步教你写股票走势图——分时图五(自定义标记)
  17. “校长”潘淳:侠之大者,一蓑烟雨任平生
  18. Vue3.0的新特性(8)Suspense
  19. static 控件设置成透明后无法正常更新数据_win10又发布10月更新,提升视频体验,解决闪屏和打印问题...
  20. MySql在Springboot项目中报错errorCode 1045 ,state 28000

热门文章

  1. idea连接postgreSQL时Test Connect按钮是灰色
  2. Log Concave Sequences 【Gym - 102302H】【矩阵快速幂】
  3. 如何训练大脑,保持专注的三种技巧
  4. 【JAVA知识梳理】集合总结!
  5. 用Windows Media Encoder建数字电台
  6. 2022数学建模美赛E题详细思路获取
  7. MATLAB快速编辑论文公式
  8. Linux命令之dd
  9. Advice for Computer Science College Students(对计算级系大学生的建议)
  10. 微处理器未来十年的主要市场,哪种指令集会主宰市场?