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拖动和缩放图片的更多相关文章

  1. Android拖动和缩放

    拖拽和缩放 多点触控的理论学完了之后,这里开始实践.本节主要介绍使用onTouchEvent()方法处理触控事件. 拖动一个对象 如果你使用的是Android 3.0或者之后的系统,那么你可以使用内置 ...

  2. Android 等比例缩放图片

    // 缩放图片 public static Bitmap zoomImg(String img, int newWidth ,int newHeight){ // 图片源 Bitmap bm = Bi ...

  3. Android多点触摸缩放图片-android学习之旅(四)

    获取多触摸点 核心代码: 获取触摸点的个数和位置 public boolean onTouch(View v, MotionEvent event) { switch (event.getAction ...

  4. Android学习笔记_38_图片的拖动、缩放功能和多点触摸

    一.基础知识: 引用 理论上 Android可以处理 多达256 个手指的触摸,大概只有章鱼哥能享受这种技术带来的便利.就编程人员来说,编写多点触摸和单点触摸的方式几乎一模一样.其奥秘在于Motion ...

  5. Andorid-如何为你的Android应用缩放图片

    很难为你的应用程序得到正确的图像缩放吗?是你的图片过大,造成内存问题?还是图片不正确缩放造成不良用户体验的结果?为了寻求一个好的解决方案,我们咨询了Andreas Agvard(索尼爱立信软件部门), ...

  6. [Android实例] 拖动滑块进行图片拼合验证方式的实现

    该篇文章从eoeAndroid搬迁过来的,原文地址:[Android实例] 拖动滑块进行图片拼合验证方式的实现 现在网站上有各种各样的验证码验证方式,比如计算大小,输入图片内容等,今天在一家网站上看到 ...

  7. 【Android】21.4 图片动画缩放示例

    分类:C#.Android.VS2015: 创建日期:2016-03-21 一.简介 该例子演示如何动画缩放图片,实现类似"点击看大图"的效果. 二.示例 1.运行截图    2. ...

  8. Android安卓开发中图片缩放讲解

    安卓开发中应用到图片的处理时候,我们通常会怎么缩放操作呢,来看下面的两种做法: 方法1:按固定比例进行缩放 在开发一些软件,如新闻客户端,很多时候要显示图片的缩略图,由于手机屏幕限制,一般情况下,我们 ...

  9. Android ImageView(scaleType属性)图片按比例缩放

    <ImageView android:id="@+id/img" android:src="@drawable/logo" android:scaleTy ...

随机推荐

  1. Amazon RDS的通用型存储(SSD)

    在今年的6月份,我们曾介绍过为Amazon EC2实例提供的基于SSD的弹性块级存储. 在公布几个月过后,这样的被称为通用型存储(SSD)的新型选择方式在创建新的EBS卷中已经占到了90%,我们从客户 ...

  2. Scala中Stream的应用场景及事实上现原理

    欢迎訪问我的独立博客:http://cuipengfei.me/blog/2014/10/23/scala-stream-application-scenario-and-how-its-implem ...

  3. 求助(VC++) 隐藏Console窗体无效

    [逝去的100~~ 2014/10/07 20: 20] 程序想要实现控制台窗体的隐藏,可是窗体每次执行总会弹出来.为什么呢? 代码例如以下: // Mini.cpp : 定义控制台应用程序的入口点. ...

  4. freemarker自己定义标签报错(三)

    freemarker自己定义标签 1.错误描写叙述 freemarker.core.ParseException: Encountered " " at line 14, colu ...

  5. Android Sqlite数据库执行插入查询更新删除的操作对比

    下面是在Android4.0上,利用Sqlite数据库的insert,query,update,delete函数以及execSql,rawQuery函数执行插入,查询,更新,删除操作花费时间的对比结果 ...

  6. IOS开发之UIView总结

    如果想调用某个类的某个方法可以写成这样,这个方法来自NSObject类 performSelector: performSelector:withObject: performSelector:wit ...

  7. 14.18 InnoDB Backup and Recovery 备份和恢复:

    14.18 InnoDB Backup and Recovery 备份和恢复: 安全数据库管理的关键是 做定期的备份,依赖你的数据卷, MySQL server的数量和数据库的负载,你可以使用那些技术 ...

  8. WEB服务器、应用程序服务器区别

    WEB服务器.应用程序服务器.HTTP服务器有何区别?IIS.Apache.Tomcat.Weblogic.WebSphere都各属于哪种服务器,这些问题困惑了很久,今天终于梳理清楚了: Web服务器 ...

  9. UVA - 12119 The Bells are Ringing (枚举)

    Perhaps you all have heard the mythical story about Tower of Hanoi (The details of this story is not ...

  10. POI读取公式的值

    excel中的数据: package poi; import java.io.FileInputStream; import java.io.IOException; import java.io.I ...