android 多点触控缩放,【移动开发】Android中图片的多点触控和缩放
前几天做项目用到相机拍照,之后能对图片进行缩放,拖拽,在此我将其单独抽取出来,后面用到时直接拿来用就行了!
效果图:
注:这里不仅能按钮缩放,还能多点触摸缩放和拖拽功能!
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中图片的多点触控和缩放相关推荐
- android jni 结构体_Android应用开发Android JNI-c/c++调用java方法
本文将带你了解Android应用开发Android JNI-c/c++调用java方法,希望本文对大家学Android有所帮助. " Android JNI-c/c++调用java方法, ...
- golang开发android的jni,用纯Golang开发Android与IOS应用
Golang1.4就对Android开发做了些支持,1.5版本前几天好像发布了,特意看了整理下,1.5支持32位与64位的android与IOS应用开发了,当然还不是很好用,听说性能比Java做的程序 ...
- 基于android个性闹钟的设计与开发,Android个性闹钟计算机毕业设计答辩ppt.ppt
基于Android的闹钟设计与开发 Logo 绪论 Contents 1 相关技术及开发平台 2 系统分析 3 系统设计 4 系统实现 5 Logo 绪论 随着移动平台的崛起 越来越多的传统PC软件被 ...
- android白色暗色主题,使用Kotlin开发Android应用(12) - Dark theme 暗色主题
Dark theme 暗色主题 样式和主题 样式是一个属性集合,用于指定单个 View 的外观. 样式可以指定字体颜色.字号.背景颜色等属性. 主题背景是一种应用于整个应用.Activity 或视图层 ...
- android openal播放器,用 Golang 开发 Android 应用(五)—— Audio(openAL)使用-Go语言中文社区...
计划按以下的内容更新 Audio(openAL) 使用 Audio 是很重要的部分,但我之前漏掉它了,所以最初的计划里没有相关内容,发现这个漏网之鱼后,我"上下求(sou)索"&q ...
- android各目录大小,Android 基础篇 — 放不同drawable文件夹中图片的大小
我们接着上篇文章Android 基础篇 - 不同DPI取哪个本地文件夹中的资源 讲,文末尾提到一个问题,为什么不同drawable文件夹中的图片大小在终端设备会不一样? 1 准备 在drawable- ...
- php图片比例不失真,PHP中图片实现等比例不失真缩放
笔者在设计http://www.cityxii.cn的主页过程中,有遇到图片缩放问题.由于页面的图片是从论坛里面抽取,而用户在论坛里面所发图片大小不一,展示出来难免会要变形. http://www.c ...
- Qt5:Qt中图片的翻转,旋转,缩放,扭曲操作
具体用到了 mirror() shear() scaled() translate() rotate() 等函数函数等会儿再写 (其中 translate() 和 rotate() 俩函数组合 ...
- 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 布局的创 ...
最新文章
- python中可以用中文作为变量-Python中用中文变量名、函数名,会影响性能吗?
- 运算符重载(c++细节篇二)
- [数据结构专训][GXOI/GZOI2019]旧词,[hdu5118]GRE Words Once More!,[hdu6333]Problem B. Harvest of Apples
- 风暴事件处理器–每个工作者的GC日志文件
- 使用腾讯OCR,图片转表格
- 5G网络什么时候普及,5G手机可以用4G的手机卡吗,5G和4G什么区别
- Cisco 3550配置DHCP中继代理
- BAJT 中高级 Java 面试题答案
- python编写登录接口_使用python编写一个登录接口
- Milne格式MATLAB,matlab考试题
- 搭建迁移训练Slim框架环境
- Surprise官方文档练习
- 329例精选matlab算法原理及源码详解——老生谈算法
- 软考初级程序员的备考经验分享
- 5款好用的时间管理软件推荐[2020年推荐]
- 一步一步教你写股票走势图——分时图五(自定义标记)
- “校长”潘淳:侠之大者,一蓑烟雨任平生
- Vue3.0的新特性(8)Suspense
- static 控件设置成透明后无法正常更新数据_win10又发布10月更新,提升视频体验,解决闪屏和打印问题...
- MySql在Springboot项目中报错errorCode 1045 ,state 28000