- 浏览: 5818496 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (890)
- WindowsPhone (0)
- android (88)
- android快速迭代 (17)
- android基础 (34)
- android进阶 (172)
- android高级 (0)
- android拾遗 (85)
- android动画&效果 (68)
- Material Design (13)
- LUA (5)
- j2me (32)
- jQuery (39)
- spring (26)
- hibernate (20)
- struts (26)
- tomcat (9)
- javascript+css+html (62)
- jsp+servlet+javabean (14)
- java (37)
- velocity+FCKeditor (13)
- linux+批处理 (9)
- mysql (19)
- MyEclipse (9)
- ajax (7)
- wap (8)
- j2ee+apache (24)
- 其他 (13)
- phonegap (35)
最新评论
-
Memories_NC:
本地lua脚本终于执行成功了,虽然不是通过redis
java中调用lua脚本语言1 -
ZHOU452840622:
大神://处理返回的接收状态 这个好像没有监听到 遇 ...
android 发送短信的两种方式 -
PXY:
拦截部分地址,怎么写的for(int i=0;i<lis ...
判断是否登录的拦截器SessionFilter -
maotou1988:
Android控件之带清空按钮(功能)的AutoComplet ...
自定义AutoCompleteTextView -
yangmaolinpl:
希望有表例子更好。。。,不过也看明白了。
浅谈onInterceptTouchEvent、onTouchEvent与onTouch
Android多点触控在本质上需要LCD驱动和程序本身设计上支持,目前市面上HTC、Motorola和Samsung等知名厂商只要使用电容屏触控原理的手机均可以支持多点触控Multitouch技术,对于网页缩放、手势操作上有更好的用户体验。 在Android平台上事件均使用了MotionEvent对象方式处理,比如开始触控时会触发ACTION_DOWN而移动操作时为ACTION_MOVE最终放开手指时触发ACTION_UP事件。当然还有用户无规则的操作可能触发ACTION_CANCEL这个动作。
首先Android开发网提醒大家多点触控需要LCD驱动和应用软件两个支持才能实现,所以部分比较老的,比如Android 2.1以前或在北美上市的手机可能无法支持多点触控在固件上,由于Apple专利原因在欧洲和亚太地区的Android 2.1以后的新款机型固件均已经在屏幕驱动中支持,同时模拟器也无法实现多点触控的测试。
下面Android123一起用Android 2.0或以上SDK中的方法来实现如何通过应用层支持多点触控操作,对于常规的控件触控操作在内部为View的setOnTouchListener()接口实现的onTouchEvent()方法来处理。对于onTouchEvent方法的参数MotionEvent我们可以详细处理来实现对多点触控的了解,比如
event.getAction() //获取触控动作比如ACTION_DOWN
event.getPointerCount(); //获取触控点的数量,比如2则可能是两个手指同时按压屏幕
event.getPointerId(nID); //对于每个触控的点的细节,我们可以通过一个循环执行getPointerId方法获取索引
event.getX(nID); //获取第nID个触控点的x位置
event.getY(nID); //获取第nID个点触控的y位置
event.getPressure(nID); //LCD可以感应出用户的手指压力,当然具体的级别由驱动和物理硬件决定的
event.getDownTime() //按下开始时间
event.getEventTime() // 事件结束时间
event.getEventTime()-event.getDownTime()); //总共按下时花费时间
有关Android多点触控的更详细技术由于目前兼容性和固件问题android123将会在以后的内容中详细讨论,这里给大家起到抛砖引玉的作用。
实例:
Activity:
首先Android开发网提醒大家多点触控需要LCD驱动和应用软件两个支持才能实现,所以部分比较老的,比如Android 2.1以前或在北美上市的手机可能无法支持多点触控在固件上,由于Apple专利原因在欧洲和亚太地区的Android 2.1以后的新款机型固件均已经在屏幕驱动中支持,同时模拟器也无法实现多点触控的测试。
下面Android123一起用Android 2.0或以上SDK中的方法来实现如何通过应用层支持多点触控操作,对于常规的控件触控操作在内部为View的setOnTouchListener()接口实现的onTouchEvent()方法来处理。对于onTouchEvent方法的参数MotionEvent我们可以详细处理来实现对多点触控的了解,比如
event.getAction() //获取触控动作比如ACTION_DOWN
event.getPointerCount(); //获取触控点的数量,比如2则可能是两个手指同时按压屏幕
event.getPointerId(nID); //对于每个触控的点的细节,我们可以通过一个循环执行getPointerId方法获取索引
event.getX(nID); //获取第nID个触控点的x位置
event.getY(nID); //获取第nID个点触控的y位置
event.getPressure(nID); //LCD可以感应出用户的手指压力,当然具体的级别由驱动和物理硬件决定的
event.getDownTime() //按下开始时间
event.getEventTime() // 事件结束时间
event.getEventTime()-event.getDownTime()); //总共按下时花费时间
有关Android多点触控的更详细技术由于目前兼容性和固件问题android123将会在以后的内容中详细讨论,这里给大家起到抛砖引玉的作用。
实例:
package com.ideasandroid.demo; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.view.MotionEvent; import android.view.SurfaceHolder; import android.view.SurfaceView; public class MTView extends SurfaceView implements SurfaceHolder.Callback { private static final int MAX_TOUCHPOINTS = 10; private static final String START_TEXT = "请随便触摸屏幕进行测试"; private Paint textPaint = new Paint(); private Paint touchPaints[] = new Paint[MAX_TOUCHPOINTS]; private int colors[] = new int[MAX_TOUCHPOINTS]; private int width, height; private float scale = 1.0f; public MTView(Context context) { super(context); SurfaceHolder holder = getHolder(); holder.addCallback(this); setFocusable(true); // 确保我们的View能获得输入焦点 setFocusableInTouchMode(true); // 确保能接收到触屏事件 init(); } private void init() { // 初始化10个不同颜色的画笔 textPaint.setColor(Color.WHITE); colors[0] = Color.BLUE; colors[1] = Color.RED; colors[2] = Color.GREEN; colors[3] = Color.YELLOW; colors[4] = Color.CYAN; colors[5] = Color.MAGENTA; colors[6] = Color.DKGRAY; colors[7] = Color.WHITE; colors[8] = Color.LTGRAY; colors[9] = Color.GRAY; for (int i = 0; i < MAX_TOUCHPOINTS; i++) { touchPaints[i] = new Paint(); touchPaints[i].setColor(colors[i]); } } /* * 处理触屏事件 */ @Override public boolean onTouchEvent(MotionEvent event) { // 获得屏幕触点数量 int pointerCount = event.getPointerCount(); if (pointerCount > MAX_TOUCHPOINTS) { pointerCount = MAX_TOUCHPOINTS; } // 锁定Canvas,开始进行相应的界面处理 Canvas c = getHolder().lockCanvas(); if (c != null) { c.drawColor(Color.BLACK); if (event.getAction() == MotionEvent.ACTION_UP) { // 当手离开屏幕时,清屏 } else { // 先在屏幕上画一个十字,然后画一个圆 for (int i = 0; i < pointerCount; i++) { // 获取一个触点的坐标,然后开始绘制 int id = event.getPointerId(i); int x = (int) event.getX(i); int y = (int) event.getY(i); drawCrosshairsAndText(x, y, touchPaints[id], i, id, c); } for (int i = 0; i < pointerCount; i++) { int id = event.getPointerId(i); int x = (int) event.getX(i); int y = (int) event.getY(i); drawCircle(x, y, touchPaints[id], c); } } // 画完后,unlock getHolder().unlockCanvasAndPost(c); } return true; } /** * 画十字及坐标信息 * * @param x * @param y * @param paint * @param ptr * @param id * @param c */ private void drawCrosshairsAndText(int x, int y, Paint paint, int ptr, int id, Canvas c) { c.drawLine(0, y, width, y, paint); c.drawLine(x, 0, x, height, paint); int textY = (int) ((15 + 20 * ptr) * scale); c.drawText("x" + ptr + "=" + x, 10 * scale, textY, c.drawText("y" + ptr + "=" + y, 70 * scale, textY, c.drawText("id" + ptr + "=" + id, width - 55 * sc } /** * 画圆 * * @param x * @param y * @param paint * @param c */ private void drawCircle(int x, int y, Paint paint, Canvas c c.drawCircle(x, y, 40 * scale, paint); } /* * 进入程序时背景画成黑色,然后把“START_TEXT”写到屏幕 */ public void surfaceChanged(SurfaceHolder holder, int format, i int height) { this.width = width; this.height = height; if (width > height) { this.scale = width / 480f; } else { this.scale = height / 480f; } textPaint.setTextSize(14 * scale); Canvas c = getHolder().lockCanvas(); if (c != null) { // 背景黑色 c.drawColor(Color.BLACK); float tWidth = textPaint.measureText(START_TEXT); c.drawText(START_TEXT, width / 2 - tWidth / 2 textPaint); getHolder().unlockCanvasAndPost(c); } } public void surfaceCreated(SurfaceHolder holder) { } public void surfaceDestroyed(SurfaceHolder holder) { } }
Activity:
package com.ideasandroid.demo; import android.app.Activity; import android.os.Bundle; import android.view.Window; import android.view.WindowManager; public class MultitouchVisible extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //隐藏标题栏 requestWindowFeature(Window.FEATURE_NO_TITLE); //设置成全屏 getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); //设置为上面的MTView setContentView(new MTView(this)); } }
发表评论
-
http://www.android-studio.org/
2018-08-06 09:25 0http://www.android-studio.org/ ... -
SlidingDrawer源码
2012-03-14 10:13 3804我把SlidingDrawer源码提了出来,希望对1.5的朋友 ... -
简单拖动效果(带Cache,需要完善)
2011-10-13 15:10 4225如何去实现一个具有幻象的拖拽效果? 所谓”幻象“就是当你按下去 ... -
Android Activity中启动另一应用程序的方法,无需得到类名
2011-08-02 14:46 17256在网上搜索了一会相关的实现代码,发现所有的文章都说是需要包名和 ... -
java-universal-tween-engine,一个动画系统库
2011-06-29 09:21 6741http://code.google.com/p/java-u ... -
网上发现的一个android UI包
2011-05-24 12:21 4089里面有些UI和效果 -
android中使用代码启动其他程序
2011-04-29 23:15 5280你要訪問其他的程序,那麼這個程序要先裝載到模擬器或真機上面,因 ... -
listView背景问题以及限制editText字数以及如果想通知别人已经不能在写
2011-04-29 22:44 32011.在listView设置好背景之后 你如果点击空白出 你会发 ... -
Android键盘和触摸事件处理
2011-04-29 22:32 7002activity和VIEW都能接收触摸和按键,如果响应事件只需 ... -
Android的绘制文本对象FontMetrics的介绍及绘制文本
2011-04-29 22:29 11488一。Android绘制文本对象FontMetrics介绍 ... -
Android View 拖动&插入
2011-04-29 22:20 3543View 拖动&插入 即: 支持 拖动图标 然后 ... -
使TextView文本可以水平和垂直滚动
2011-04-29 21:59 14425在做一个小的电子书程序,要求电子书具有放大缩小的功能,所以肯定 ... -
ArrayAdapter源码
2011-04-29 12:29 6297看看人家怎么写的。 /* * Copyright (C ... -
Android下获取开机时间
2011-04-02 21:51 6222找了一圈没发现能得到开机启动时间资料,于是乎突发奇想,得到了解 ... -
AutoCompleteTextView连接到数据库
2011-03-30 20:49 4722AutoCompleteTextView可以根据输入 ... -
改变屏幕Brightness(亮度)
2011-03-30 12:48 4600http://www.eoeandroid.com/forum ... -
android 拖拽图片&拖动浮动按钮到处跑
2011-02-24 20:55 31768来自老外: import android.app.Acti ... -
拖动一个控件在另一个控件(layout)上,并固定位置在几个位置显示
2011-02-24 20:51 5892实现效果: 鼠标拖动btn SSS,SSS在水平的layo ... -
Handler与Message类,实现n秒后无操作自动消失功能
2011-02-24 20:45 4634实现功能:某控件不操作10秒后,自动消失。如照相机变焦条出现后 ... -
带删除按钮的ListView
2011-02-24 10:33 6144不用说了,上图先: import java.util.A ...
相关推荐
这个"android多点触控demo,两只手同时拖拽"是针对Android平台的一个示例项目,其目标是实现用户可以通过两只手指同时对屏幕上的元素进行拖动操作。 多点触控的基础是Android系统提供的MotionEvent类,它是处理触摸...
这个"Android多点触控实例源码"提供了一个实用的学习资源,帮助开发者深入理解并实践Android中的多点触控技术。以下将详细介绍该源码中的关键知识点。 1. **MotionEvent**:在Android中,处理触摸事件的核心类是`...
1. **Android多点触控基础**: - **MotionEvent类**:Android系统通过MotionEvent对象来处理触摸事件,包括ACTION_DOWN、ACTION_UP、ACTION_MOVE等,这些事件对应于用户触摸屏幕的不同阶段。 - **Touch事件分发**...
在Android开发中,多点触控(Multi-Touch)是一项重要的功能,它允许用户通过...这个实例不仅覆盖了多点触控的基本原理,还可能涉及到了手势识别、性能优化等相关技术,对Android开发人员来说是一份宝贵的学习资料。
Android多点触控在本质上需要LCD驱动和程序本身设计上支持,目前市面上HTC、Motorola和Samsung等知名厂商只要使用电容屏触控原理的手机均可以支持多点触控Multitouch技术,对于网页缩放、手势操作上有更好的用户体验...
这个名为"Android 多点触控实例源码"的压缩包提供了实现这一功能的源代码,对于学习和理解Android多点触控编程具有极大的帮助。 1. **Android多点触控基础** - 触摸事件:Android系统通过`MotionEvent`类处理触摸...
在Android平台上,多点触控(Multi-Touch)...通过分析和学习"Android 多点触控实例源码.zip"中的代码,开发者可以深入理解多点触控的工作原理,并能灵活运用到自己的项目中,创建出更加直观和互动性强的Android应用。
总的来说,这个Demo涵盖了Android多点触控事件的处理和UI动态更新,对于开发者来说,这是一个很好的学习实例,可以帮助他们理解如何在实际应用中实现类似的功能。通过研究源码,开发者不仅可以掌握多点触控的基本...
在Android平台上,多点触控(Multi-Touch)是一项重要的功能,它允许用户同时...通过研究和理解这些源码,开发者可以更好地掌握Android多点触控的实现原理,并将其应用到自己的项目中,提升应用的交互性和用户体验。
总的来说,这个实战项目覆盖了Android多点触控的基本原理和实现方式,通过学习这个Demo,开发者不仅可以掌握双指缩放和移动的实现,还能深入理解Android触摸事件的处理机制,为开发更复杂的触控应用打下坚实基础。...
本教程将基于提供的"android多点触控放大缩小图片demo"来深入讲解如何实现这一功能。 首先,我们要理解多点触控的基本原理。Android系统支持同时检测多个触摸事件,通过`MotionEvent`类来处理这些事件。当用户同时...
总的来说,这个实例源码提供了一个实现Android多点触控功能的基础框架,可以帮助开发者深入理解多点触控的原理,并且能够自定义手势操作,为Android应用增加更多交互性。通过阅读和分析源代码,你可以了解到如何处理...
在Android开发中,多点触控(Multitouch)和手势识别是构建用户交互界面的重要组成部分,特别是对于游戏和复杂的UI应用。FreeformGestureDetector是一个开源项目,专注于将多点触控事件转换为可识别的手势,从而为...
在Android平台上,实现多点触控、多张图片的拖拽、缩放和旋转功能是一项常见的需求,尤其在开发互动式应用或者图像编辑类应用时。以下是对这一主题的详细阐述。 **一、多点触控(Multi-Touch)** 多点触控是指设备...
在这个“Android多点触控控制字体大小”的项目中,开发者创建了一个简单的Demo,旨在帮助学习者理解如何在Android环境中实现这一功能。这个源码特别适合计算机科学或信息技术专业的学生作为毕业设计或论文研究。 ...
首先,我们需要了解多点触控的基本原理。在Android中,多点触控是通过`MotionEvent`类来处理的,该类提供了对触摸事件的管理。我们可以通过检测`ACTION_DOWN`、`ACTION_POINTER_DOWN`、`ACTION_MOVE`和`ACTION_UP`等...