- 浏览: 87815 次
- 性别:
- 来自: 北京
最新评论
-
LiuYiJie2007:
public static String getPublicK ...
Android publickey获取 -
LiuYiJie2007:
getPublicKey( )是你自己写法方法 是什么?new ...
Android publickey获取 -
liujia9234:
我试了,不行,最不靠谱了
最靠谱的禁止ViewPager滑动方法 -
kedongjun:
非常强大
关于android通讯录加载大数据的优化问题 -
xunhuan01:
view.getImageMatrix(), savedMat ...
多点触摸放大图片的自定义listener
可以看到很多相册应用,通过两根手指的操作,能让图片放大缩小。很简单,通过自定义的继承于onTouchListener的类,去实现这样的效果。代码如下:
package cn.test; import android.graphics.Matrix; import android.graphics.PointF; import android.util.FloatMath; import android.view.MotionEvent; import android.view.View; import android.view.View.OnTouchListener; import android.widget.ImageView; import android.widget.ImageView.ScaleType; public class MulitPointTouchListener implements OnTouchListener { // These matrices will be used to move and zoom image Matrix matrix = new Matrix(); Matrix savedMatrix = new Matrix(); public ImageView image; // We can be in one of these 3 states static final int NONE = 0; static final int DRAG = 1; static final int ZOOM = 2; int mode = NONE; // Remember some things for zooming PointF start = new PointF(); PointF mid = new PointF(); float oldDist = 1f; public MulitPointTouchListener(ImageView image) { super(); this.image = image; } @Override public boolean onTouch(View v, MotionEvent event) { this.image.setScaleType(ScaleType.MATRIX); ImageView view = (ImageView) v; // Log.e("view_width", // view.getImageMatrix()..toString()+"*"+v.getWidth()); // Dump touch event to log dumpEvent(event); // Handle touch events here... switch (event.getAction() & MotionEvent.ACTION_MASK) { case MotionEvent.ACTION_DOWN: matrix.set(view.getImageMatrix()); savedMatrix.set(matrix); start.set(event.getX(), event.getY()); //Log.d(TAG, "mode=DRAG"); mode = DRAG; /* * float scaleWidth=180f/320; float scaleHeight=240f/480; * matrix.reset(); matrix.postScale(scaleWidth, scaleHeight); */ //Log.d(TAG, "mode=NONE"); break; case MotionEvent.ACTION_POINTER_DOWN: oldDist = spacing(event); //Log.d(TAG, "oldDist=" + oldDist); if (oldDist > 10f) { savedMatrix.set(matrix); midPoint(mid, event); mode = ZOOM; //Log.d(TAG, "mode=ZOOM"); } break; case MotionEvent.ACTION_UP: case MotionEvent.ACTION_POINTER_UP: mode = NONE; //Log.e("view.getWidth", view.getWidth() + ""); //Log.e("view.getHeight", view.getHeight() + ""); break; case MotionEvent.ACTION_MOVE: if (mode == DRAG) { // ... matrix.set(savedMatrix); matrix.postTranslate(event.getX() - start.x, event.getY() - start.y); } else if (mode == ZOOM) { float newDist = spacing(event); //Log.d(TAG, "newDist=" + newDist); if (newDist > 10f) { matrix.set(savedMatrix); float scale = newDist / oldDist; matrix.postScale(scale, scale, mid.x, mid.y); } } break; } view.setImageMatrix(matrix); return true; // indicate event was handled } private void dumpEvent(MotionEvent event) { String names[] = { "DOWN", "UP", "MOVE", "CANCEL", "OUTSIDE", "POINTER_DOWN", "POINTER_UP", "7?", "8?", "9?" }; StringBuilder sb = new StringBuilder(); int action = event.getAction(); int actionCode = action & MotionEvent.ACTION_MASK; sb.append("event ACTION_").append(names[actionCode]); if (actionCode == MotionEvent.ACTION_POINTER_DOWN || actionCode == MotionEvent.ACTION_POINTER_UP) { sb.append("(pid ").append( action >> MotionEvent.ACTION_POINTER_ID_SHIFT); sb.append(")"); } sb.append("["); for (int i = 0; i < event.getPointerCount(); i++) { sb.append("#").append(i); sb.append("(pid ").append(event.getPointerId(i)); sb.append(")=").append((int) event.getX(i)); sb.append(",").append((int) event.getY(i)); if (i + 1 < event.getPointerCount()) sb.append(";"); } sb.append("]"); //Log.d(TAG, sb.toString()); } /** Determine the space between the first two fingers */ private float spacing(MotionEvent event) { float x = event.getX(0) - event.getX(1); float y = event.getY(0) - event.getY(1); return FloatMath.sqrt(x * x + y * y); } /** Calculate the mid point of the first two fingers */ private void midPoint(PointF point, MotionEvent event) { float x = event.getX(0) + event.getX(1); float y = event.getY(0) + event.getY(1); point.set(x / 2, y / 2); } }
评论
1 楼
xunhuan01
2012-04-11
view.getImageMatrix(), savedMatrix.set(matrix); 这两句是什么意思?
为什么是event.getx()-start.x,event.gety()-start.y
为什么是event.getx()-start.x,event.gety()-start.y
发表评论
-
Android_低版本使用ActionBar
2014-08-26 11:09 1096转载 http://blog.csdn.net/tianjf0 ... -
如何屏蔽android webview高度选中框
2014-02-19 12:04 747如标题所述,解决方法是在 html的样式中加入 *{-webk ... -
屏蔽ScrollView惯性滚动的方法
2013-08-08 13:36 5714ScrollView中有一种惯性滚动的效果,想让这个Scrol ... -
android 图片LOMO效果
2013-07-25 13:59 872import android.graphics.Bitmap; ... -
GitHub最火的android 项目
2013-07-25 13:14 780GitHub在中国的火爆程度无需多言,越来越多的开源项目迁移到 ... -
listview 点击列表项时,项中的Button会触发点击效果
2013-06-05 19:21 1284开发中,难免会在列表项中, 加入Button ,而button ... -
圆形不滚动的进度条
2013-05-17 11:38 849这种效果的进度条 代码如下: package com. ... -
最靠谱的禁止ViewPager滑动方法
2013-05-15 14:44 4957最近做项目要求某种情况下ViewPager不能滑动,在网上找了 ... -
viewpager主页面响应子页面 onkeydown事件的方法
2013-05-13 19:35 1618大家在开发中不少地方要用到ViewPager这个类,ViewP ... -
Mina 学习笔记 TCP主要接口
2013-05-05 23:21 1225(1.)IoService: 这个接口 ... -
android动画插件器
2013-04-27 10:01 830首先要了解为什么需要插值器,因为在补间动画中,我们一般只定义关 ... -
imageView 的 android:maxHeight,maxWidth属性
2013-03-29 10:17 816大家使用android:maxHeight,maxWidth属 ... -
android中获取下载地址文件的类型的方法
2013-03-28 11:33 1025MimeTypeMap mimeTypeMap = Mime ... -
res与res-auto的区别
2013-03-27 14:55 3961通常我们在布局文件中使用自定义属性的时候 会这样写 xmln ... -
滑动开关控件
2013-03-26 22:39 815public class SlidButton exten ... -
TextView使用SpannableString设置复合文本
2013-03-23 23:35 8791、BackgroundColorSpan 背景色 Sp ... -
Android编程之SparseArray<E>详解
2013-03-21 23:03 984一、构造 从构造方法我 ... -
判断系统是否支持 DownloadManager服务
2013-03-18 14:25 862public static boolean isDownloa ... -
android ndk native_activity.h
2013-03-12 15:25 1767#ifndef ANDROID_NATIVE_ACTIVITY ... -
android ndk obb.h
2013-03-12 15:14 1133#ifndef ANDROID_OBB_H #define A ...
相关推荐
4. **监听器(Event Listener)**:我们需要为舞台或特定显示对象添加触摸事件监听器,以便在触摸事件发生时执行相应的处理函数。例如,可以使用`addEventListener`方法添加监听器。 5. **多点触摸处理**:处理多个...
在Android开发中,图片处理和用户交互是两个非常重要的方面,尤其在开发图像查看器或者画廊应用时,图片的缩放和多点触摸功能更是不可或缺。本项目"android 图片缩放和多点触摸源码"正是针对这两个功能进行实现的...
在给定的标题"自定义dialo,可以传listener"和描述"自定义dialog,可以传listener"中,我们可以深入探讨如何在Android中创建一个自定义的`Dialog`并添加监听器。 1. **自定义Dialog** 自定义`Dialog`通常是因为...
本篇文章将深入探讨如何自定义GestureDetector来实现多点触控功能,以及自定义手势的实现原理。 一、Android多点触控基础 在Android系统中,多点触控主要依赖于MotionEvent类,它包含了处理触摸事件的所有信息,如...
本文将深入探讨如何实现动态更新`ImageView`中的图片,并利用自定义监听器来跟踪和处理加载过程。这在应用中非常实用,比如在加载网络头像、商品图片或动态刷新数据时。 首先,我们要理解`ImageView`的基本用法。在...
源码PercentVisibleLayout,VisibilityPercentageLayout是一个带有自定义的listener的布局(继承自RelativeLayout),每当布局发生变化的时候能给出布局可见百分比。也支持可见像素的listener。
在Cocos2d-x 3.2版本中,多点触摸功能被广泛应用于游戏和交互式应用中,允许用户同时处理多个触摸输入。这个功能的实现主要依赖于事件处理和事件分发机制的改进。以下是关于Cocos2d-x 3.2中多点触摸的详细说明: ...
本教程将重点讲解如何通过自定义ScrollView来实现图片的拉伸放大效果,并在用户上滑时动态修改标题栏的状态。这一功能常用于诸如新闻详情页或者电商商品详情页等场景,能够提升用户的浏览体验。 首先,我们需要创建...
本文将深入探讨如何使用C#实现一个简单的TcpListener来支持异步通信,允许多客户端同时连接。 首先,我们需要理解TcpListener类在C#中的作用。TcpListener是.NET Framework提供的一个类,用于监听特定IP地址和端口...
在Spring Boot应用中,整合Listener主要是为了监听应用的生命周期事件,例如在应用启动或关闭时执行特定的操作。这里我们讨论两种整合Listener的方式。 ### 方式一:通过注解扫描完成Listener组件的注册 1. **创建...
// 绘制图片 gc.drawImage(image, 0, 0); // 添加其他绘制操作,如文字 } } ``` ### 7. 结合Eclipse RCP 如果你正在开发Eclipse Rich Client Platform (RCP) 应用程序,自定义控件可以增强应用程序的用户体验。...
标题中的"listener我的listener listener我的listener"可能是在强调Listener的重要性或者是在多次提及一个与Listener相关的个人项目或资源。 在Java中,Listener模式是设计模式的一种,属于行为型模式,它允许我们...
Oracle RAC 监听器配置文件 listener.ora 详解 Oracle RAC 监听器配置文件 listener.ora 是一个核心配置文件,用于配置 Oracle Net Listener 的参数。本文将详细介绍 listener.ora 文件的配置参数、协议地址参数、...
Java拼图游戏是一款基于Java编程语言开发的娱乐应用,它允许用户自定义拼图的图片来源和分割块的数量,从而提供了高度的个性化体验。这款游戏中,用户可以选择任何想要的图片,将其转化为拼图,然后尝试将这些散乱的...
TcpListener 是 .NET Framework 中用于创建 TCP 服务器端应用程序的关键组件。它允许程序监听来自多个客户端的连接请求,实现网络通信。在这个场景中,我们关注的是如何使用 TcpListener 创建一个可以处理多客户端...
Oracle TNS Listener是Oracle数据库系统中用于监听客户端请求的关键组件。其基本功能是在网络上监听客户端发来的连接请求,并对这些请求做出响应。然而,TNS Listener也存在一系列安全漏洞,尤其是缓冲区溢出和配置...
这里`IPAddress.Any`表示监听所有网络接口,`12345`是自定义的端口号。 2. 调用`Start()`方法启动监听服务: ```csharp listener.Start(); ``` 3. 使用`AcceptTcpClient()`方法阻塞地等待客户端连接。当有客户端...
然而,有时候系统默认的样式可能无法满足我们的设计需求,这时候就需要我们自定义`DatePickerDialog`来达到预期的效果。本教程将详细讲解如何在Android中实现自定义的`DatePickerDialog`。 首先,我们需要了解`...
C# Socket、TCPClient、TCPListener 用法详解 C# 中的 Socket 编程是基于 Windows Sockets (Winsock) 接口的托管实现,提供了一个强大且灵活的网络编程模型。在本文中,我们将详细介绍 C# 中的 Socket 编程,包括 ...
在ExtJS框架中,`handler`和`listener`都是用于响应用户交互的关键概念,它们各自有不同的使用场景和特点。理解两者的区别对于有效管理和组织应用的事件处理至关重要。 1. **Handler** - `handler`通常与`Action`...