Android拖动和缩放图片
Android拖动和缩放图片
2014年5月9日
我们在使用应用其中常常须要浏览图片。比方在微信其中。点击图片之后能够对图片进行缩放。
本博客介绍怎样对图片进行拖拽和缩放。这首先要了解Android中的触摸机制了,在屏幕中有手指按下、手指抬起、手指移动还有多个手指触摸的动作。
我们要实现对图片的拖拽和缩放就是要基于这些动作来进行逻辑处理。
图片的拖拽主要是计算手指開始的位置与当前手指的位置关系,来进行平移的,详细能够看代码。
图片的缩放就涉及到计算两点之间的距离来得到缩放比,调用矩阵方法来达到缩放的效果。
演示样例代码:http://download.csdn.net/detail/wwj_748/7324363
package com.wwj.dragscale; 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; /**
* 对图片进行拖拽和缩放
*
* @author wwj
*
*/
public class MainActivity extends Activity {
private ImageView imageView; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
imageView = (ImageView) findViewById(R.id.imageView);
imageView.setOnTouchListener(new TouchListener());
} private class TouchListener implements OnTouchListener { private PointF startPoint = new PointF();
private Matrix matrix = new Matrix();
private Matrix currentMaritx = new Matrix(); private int mode = 0; // 用于标记模式
private static final int DRAG = 1; // 拖动
private static final int ZOOM = 2; // 放大
private float startDis = 0;
private PointF midPoint; // 中心点 @Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction() & MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_DOWN:
mode = DRAG; // 拖拽
currentMaritx.set(imageView.getImageMatrix()); // 记录ImageView当前移动位置
startPoint.set(event.getX(), event.getY()); // 開始点
break;
case MotionEvent.ACTION_MOVE:// 移动事件
if (mode == DRAG) { // 图片拖动事件
float dx = event.getX() - startPoint.x; // x轴移动距离
float dy = event.getY() - startPoint.y;
matrix.set(currentMaritx); // 在当前的位置基础上移动
matrix.postTranslate(dx, dy);
} else if (mode == ZOOM) { // 图片放大事件
float endDis = distance(event); // 结束距离
if (endDis > 10f) {
float scale = endDis / startDis; // 放大倍数
matrix.set(currentMaritx);
matrix.postScale(scale, scale, midPoint.x, midPoint.y);
} }
break;
case MotionEvent.ACTION_UP:
mode = 0;
break;
// 有手指离开屏幕,但屏幕还有触点(手指)
case MotionEvent.ACTION_POINTER_UP:
mode = 0;
break;
// 当屏幕上已经有触点(手指),再有一个手指压下屏幕
case MotionEvent.ACTION_POINTER_DOWN:
mode = ZOOM;
startDis = distance(event);
if (startDis > 10f) { // 避免手指上有两个
midPoint = mid(event);
currentMaritx.set(imageView.getImageMatrix()); // 记录当前的缩放倍数
}
break;
}
// 显示缩放后的图片
imageView.setImageMatrix(matrix);
return true;
} } /**
* 计算两点之间的距离
*
* @param event
* @return
*/
public static 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);
} /**
* 计算两点之间的中间点
*
* @param event
* @return
*/
public static 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);
} }
版权声明:本文博客原创文章,博客,未经同意,不得转载。
Android拖动和缩放图片的更多相关文章
- Android拖动和缩放
拖拽和缩放 多点触控的理论学完了之后,这里开始实践.本节主要介绍使用onTouchEvent()方法处理触控事件. 拖动一个对象 如果你使用的是Android 3.0或者之后的系统,那么你可以使用内置 ...
- Android 等比例缩放图片
// 缩放图片 public static Bitmap zoomImg(String img, int newWidth ,int newHeight){ // 图片源 Bitmap bm = Bi ...
- Android多点触摸缩放图片-android学习之旅(四)
获取多触摸点 核心代码: 获取触摸点的个数和位置 public boolean onTouch(View v, MotionEvent event) { switch (event.getAction ...
- Android学习笔记_38_图片的拖动、缩放功能和多点触摸
一.基础知识: 引用 理论上 Android可以处理 多达256 个手指的触摸,大概只有章鱼哥能享受这种技术带来的便利.就编程人员来说,编写多点触摸和单点触摸的方式几乎一模一样.其奥秘在于Motion ...
- Andorid-如何为你的Android应用缩放图片
很难为你的应用程序得到正确的图像缩放吗?是你的图片过大,造成内存问题?还是图片不正确缩放造成不良用户体验的结果?为了寻求一个好的解决方案,我们咨询了Andreas Agvard(索尼爱立信软件部门), ...
- [Android实例] 拖动滑块进行图片拼合验证方式的实现
该篇文章从eoeAndroid搬迁过来的,原文地址:[Android实例] 拖动滑块进行图片拼合验证方式的实现 现在网站上有各种各样的验证码验证方式,比如计算大小,输入图片内容等,今天在一家网站上看到 ...
- 【Android】21.4 图片动画缩放示例
分类:C#.Android.VS2015: 创建日期:2016-03-21 一.简介 该例子演示如何动画缩放图片,实现类似"点击看大图"的效果. 二.示例 1.运行截图 2. ...
- Android安卓开发中图片缩放讲解
安卓开发中应用到图片的处理时候,我们通常会怎么缩放操作呢,来看下面的两种做法: 方法1:按固定比例进行缩放 在开发一些软件,如新闻客户端,很多时候要显示图片的缩略图,由于手机屏幕限制,一般情况下,我们 ...
- Android ImageView(scaleType属性)图片按比例缩放
<ImageView android:id="@+id/img" android:src="@drawable/logo" android:scaleTy ...
随机推荐
- svn 标示提示
原来没有遇到过, 突然发现这次写的项目有几个文件时 这个"表示的" ,死活找不到原因,并且提交,改动 都好烦人,还要锁定什么嘛的. 最后最终知道, 这个意思是 文件的状态为 &q ...
- Struts 2中的constant详解
通过对这些属性的配置,可以改变Struts 2 框架的一些默认行为,这些配置可以在struts.xml文件中完成,也可以在struts.properties文件中完成. 1.<constant ...
- linux命令:使用man, 导出man
要查一个命令怎么使用,使用"man 命令", eg: man find, man ls; "info 命令"貌似也可以看, info find, info ls ...
- 设置MyEclipse中代码的换行长度
1.打开Preferences -> Java -> Code Style -> Formatter. 2.选择Edit -> Line Wrapping -> Max ...
- WPF的MVVM
一.关于WPF WPF(Windows Presentation Foundation) ,从名字来看,Microsoft想把WPF技术作为Windows程序外观(表现层)的基础.我们知道,现在开发 ...
- OpenCV Python教程(3、直方图的计算与显示)
转载请详细注明原作者及出处,谢谢! 本篇文章介绍如何用OpenCV Python来计算直方图,并简略介绍用NumPy和Matplotlib计算和绘制直方图 直方图的背景知识.用途什么的就直接略过去了. ...
- kernel hexdump分析 (2.0)
有的时候print_hex_dump_bytes循环打印很多信息的时候(大于1K) 用UART串口打印的信息总是会有丢失,估计是printk缓冲区的问题把,具体原因不是太清楚 于是自己写了个比较笨的d ...
- zipalign 文件路径问题
在使用zipalign,对Android程序进行打包,有些时候可能提示找不到zipalign ,可以复制一份放在相应的文件夹就行了 windows: 如果缺少zipalign,在网上找到相应的文件放在 ...
- alv行可编辑时带出描述
ALV显示可以编辑的状态下可以带出描述信息等,比如维护表程序输入公司代码时需要带出公司代码的描述,这时就需要通过下面事件来触发 定义一个类: CLASS lcl_event_receiver DEFI ...
- Windows 8 和 Windows 8.1 中对插件和 ActiveX 的支持
此文章将介绍页面在 Windows 8 适用于桌面版的 Internet Explorer 中与在新 Windows UI 的 Internet Explorer 中的不同表现. Windows 8 ...