手势识别官方教程(7)识别缩放手势用ScaleGestureDetector.GestureDetector和ScaleGestureDetector.SimpleOnScaleGestureListener
1.Use Touch to Perform Scaling
As discussed in Detecting Common Gestures, GestureDetector
helps you detect common gestures used by Android such as scrolling, flinging, and long press. For scaling, Android provides ScaleGestureDetector
. GestureDetector
and ScaleGestureDetector
can be used together when you want a view to recognize additional gestures.
ScaleGestureDetector 是用来识别缩放手势的。它可以和GestureDetector同时使用,来识别额外的手势.
To report detected gesture events, gesture detectors use listener objects passed to their constructors.ScaleGestureDetector
uses ScaleGestureDetector.OnScaleGestureListener
. Android provides ScaleGestureDetector.SimpleOnScaleGestureListener
as a helper class that you can extend if you don’t care about all of the reported events.
ScaleGestureDetector.SimpleOnScaleGestureListener 是一个封装好的缩放手势类.用来接收探测到的手势,构造手势探测器 ScaleGestureDetector 的时候要用到它.
2.Basic scaling example
Here is a snippet that illustrates the basic ingredients involved in scaling.
1 private ScaleGestureDetector mScaleDetector;
2 private float mScaleFactor = 1.f;
3
4 public MyCustomView(Context mContext){
5 ...
6 // View code goes here
7 ...
8 mScaleDetector = new ScaleGestureDetector(context, new ScaleListener());
9 }
10
11 @Override
12 public boolean onTouchEvent(MotionEvent ev) {
13 // Let the ScaleGestureDetector inspect all events.
14 mScaleDetector.onTouchEvent(ev);
15 return true;
16 }
17
18 @Override
19 public void onDraw(Canvas canvas) {
20 super.onDraw(canvas);
21
22 canvas.save();
23 canvas.scale(mScaleFactor, mScaleFactor);
24 ...
25 // onDraw() code goes here
26 ...
27 canvas.restore();
28 }
29
30 private class ScaleListener
31 extends ScaleGestureDetector.SimpleOnScaleGestureListener {
32 @Override
33 public boolean onScale(ScaleGestureDetector detector) {
34 mScaleFactor *= detector.getScaleFactor();
35
36 // Don't let the object get too small or too large.
37 mScaleFactor = Math.max(0.1f, Math.min(mScaleFactor, 5.0f));
38
39 invalidate();
40 return true;
41 }
42 }
3.More complex scaling example
Here is a more complex example from the InteractiveChart
sample provided with this class. TheInteractiveChart
sample supports both scrolling (panning) and scaling with multiple fingers, using the ScaleGestureDetector
"span" (getCurrentSpanX/Y
) and "focus" (getFocusX/Y
) features:
下面是一个复杂的手势识别示例的片段,使用了两个识别器.完整示例下载地址 InteractiveChart
@Override
private RectF mCurrentViewport =
new RectF(AXIS_X_MIN, AXIS_Y_MIN, AXIS_X_MAX, AXIS_Y_MAX);
private Rect mContentRect;
private ScaleGestureDetector mScaleGestureDetector;
...
public boolean onTouchEvent(MotionEvent event) {
boolean retVal = mScaleGestureDetector.onTouchEvent(event);
retVal = mGestureDetector.onTouchEvent(event) || retVal;
return retVal || super.onTouchEvent(event);
} /**
* The scale listener, used for handling multi-finger scale gestures.
*/
private final ScaleGestureDetector.OnScaleGestureListener mScaleGestureListener
= new ScaleGestureDetector.SimpleOnScaleGestureListener() {
/**
* This is the active focal point in terms of the viewport. Could be a local
* variable but kept here to minimize per-frame allocations.
*/
private PointF viewportFocus = new PointF();
private float lastSpanX;
private float lastSpanY; // Detects that new pointers are going down.
@Override
public boolean onScaleBegin(ScaleGestureDetector scaleGestureDetector) {
lastSpanX = ScaleGestureDetectorCompat.
getCurrentSpanX(scaleGestureDetector);
lastSpanY = ScaleGestureDetectorCompat.
getCurrentSpanY(scaleGestureDetector);
return true;
} @Override
public boolean onScale(ScaleGestureDetector scaleGestureDetector) { float spanX = ScaleGestureDetectorCompat.
getCurrentSpanX(scaleGestureDetector);
float spanY = ScaleGestureDetectorCompat.
getCurrentSpanY(scaleGestureDetector); float newWidth = lastSpanX / spanX * mCurrentViewport.width();
float newHeight = lastSpanY / spanY * mCurrentViewport.height(); float focusX = scaleGestureDetector.getFocusX();
float focusY = scaleGestureDetector.getFocusY();
// Makes sure that the chart point is within the chart region.
// See the sample for the implementation of hitTest().
hitTest(scaleGestureDetector.getFocusX(),
scaleGestureDetector.getFocusY(),
viewportFocus); mCurrentViewport.set(
viewportFocus.x
- newWidth * (focusX - mContentRect.left)
/ mContentRect.width(),
viewportFocus.y
- newHeight * (mContentRect.bottom - focusY)
/ mContentRect.height(),
,
);
mCurrentViewport.right = mCurrentViewport.left + newWidth;
mCurrentViewport.bottom = mCurrentViewport.top + newHeight;
...
// Invalidates the View to update the display.
ViewCompat.postInvalidateOnAnimation(InteractiveLineGraphView.this); lastSpanX = spanX;
lastSpanY = spanY;
return true;
}
};
手势识别官方教程(7)识别缩放手势用ScaleGestureDetector.GestureDetector和ScaleGestureDetector.SimpleOnScaleGestureListener的更多相关文章
- 手势识别官方教程(7)识别缩放手势用ScaleGestureDetector和SimpleOnScaleGestureListener
1.Use Touch to Perform Scaling As discussed in Detecting Common Gestures, GestureDetector helps you ...
- 手势识别官方教程(2)识别常见手势用GestureDetector+手势回调接口/手势抽象类
简介 GestureDetector识别手势. GestureDetector.OnGestureListener是识别手势后的回调接口.GestureDetector.SimpleOnGesture ...
- 手势识别官方教程(6)识别拖拽手势用GestureDetector.SimpleOnGestureListener和onTouchEvent
三种现实drag方式 1,在3.0以后可以直接用 View.OnDragListener (在onTouchEvent中调用某个view的startDrag()) 2,onTouchEvent() ...
- 手势识别官方教程(3)识别移动手势(识别速度用VelocityTracker)
moving手势在onTouchEvent()或onTouch()中就可识别,编程时主要是识别积云的速度用VelocityTracker等, Tracking Movement This lesson ...
- 手势识别官方教程(8)拦截触摸事件,得到触摸的属性如速度,距离等,控制view展开
onInterceptTouchEvent可在onTouchEvent()前拦截触摸事件, ViewConfiguration得到触摸的属性如速度,距离等, TouchDelegate控制view展开 ...
- 手势识别官方教程(4)在挑划或拖动手势后view的滚动用ScrollView和 HorizontalScrollView,自定义用Scroller或OverScroller
简单滚动用ScrollView和 HorizontalScrollView就够.自定义view时可能要自定义滚动效果,可以使用 Scroller或 OverScroller Animating a S ...
- Unity性能优化(2)-官方教程Diagnosing performance problems using the Profiler window翻译
本文是Unity官方教程,性能优化系列的第二篇<Diagnosing performance problems using the Profiler window>的简单翻译. 相关文章: ...
- Unity性能优化(3)-官方教程Optimizing garbage collection in Unity games翻译
本文是Unity官方教程,性能优化系列的第三篇<Optimizing garbage collection in Unity games>的翻译. 相关文章: Unity性能优化(1)-官 ...
- [爬虫] 学Scrapy,顺便把它的官方教程给爬下来
想学爬虫主要是因为算法和数据是密切相关的,有数据之后可以玩更多有意思的事情,数据量大可以挖掘挖掘到更多的信息. 之前只会通过python中的request库来下载网页内容,再用BeautifulSou ...
随机推荐
- iOS开发——百度云推送
由于公司项目是集成的极光推送,详见下一篇博客. 集成百度推送大体相当,最好都参考官方文档集成,官方文档或官方网站教程是最好的博客. 百度Push服务SDK用户手册(iOS版) http://push. ...
- C# this关键字详解
this关键字主要有一下几个用途:1,this 用来引用当前类的实例,和扩展方法的第一个参数的修饰符 }2,限定被相似的名称隐藏的成员,例如: public Employee(string name, ...
- Java实战之04JavaWeb-04JSP、EL表达式、JSTL标签库
一.jsp部分 只要是与页面显示相关的都是重点 1.jsp的脚本 <%java代码%>:被翻译到service方法内部,局部变量,局部的功能 <%=表达式或变量%>:翻译成se ...
- 常用AWK命令
常用AWK命令 Awk is a programming language which allows easy manipulation of structured data and the gene ...
- Java如何获得平台相关的行分隔符、路径分隔符?
我的技术博客经常被流氓网站恶意爬取转载.请移步原文:http://www.cnblogs.com/hamhog/p/3550194.html ,享受整齐的排版.有效的链接.正确的代码缩进.更好的阅读体 ...
- svn 相关
// svn相关内容,windows下的可以根据网上的,安装客户端和服务器端安装成功后,可以在服务器端中的 Repositories中建立相关的项目库文件夹,右键相应的文件夹可以复制相关的 url,一 ...
- c#的多线程
多线程的使用方法: Thread t = new Thread(new ThreadStart (StartMethod)); t.Start(); private void StartMethod( ...
- 转 修改oracle用户密码永不过期
1.查看用户的proifle是哪个,一般是default: sql>SELECT username,PROFILE FROM dba_users; 2.查看指定概要文件(如default)的 ...
- javascript学习笔记4
1. 分析一下代码执行结果 分析为什么? var a = 12; b = 34; c = 56; ++a; //a结果 13 a++; //a结果 14 c = ++a + b; ...
- Substring的简单使用
string myString = "测试一下函数Substring()是怎么用的"; //Substring()在C#中有两个重载函数 //分别如下示例 //如果参数为一个长整数 ...