`
lynen
  • 浏览: 128511 次
  • 性别: Icon_minigender_2
  • 来自: 杭州
社区版块
存档分类
最新评论

android多点触摸实例及疑问

 
阅读更多

多点触摸的一个比较简明的示例:

示例代码出处:http://krvarma-android-samples.googlecode.com/svn/trunk/multitouchsample

 

在学习此示例的时候发现multitouch最多可以处理5个手指,5个以上的则不能处理~~

 

package com.varma.samples.multitouchsample;

import java.util.ArrayList;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.DashPathEffect;
import android.graphics.Paint;
import android.graphics.PointF;
import android.util.AttributeSet;
//import android.util.FloatMath;
import android.view.MotionEvent;
import android.view.View;

public class MultitouchView extends View {
	private static final int STROKE_WIDTH = 1;
	private static final int CIRCLE_RADIUS = 20;
	
	private ArrayList<PointF> touchPoints = null;
	private Paint drawingPaint = null;
	private boolean isMultiTouch = false;
	private int pathEffectPhase = 0;

	public MultitouchView(Context context) {
		super(context);
		
		initialize(context);
	}

	public MultitouchView(Context context, AttributeSet attrs, int defStyle) {
		super(context, attrs, defStyle);
		
		initialize(context);
	}

	public MultitouchView(Context context, AttributeSet attrs) {
		super(context, attrs);
		
		initialize(context);
	}
	
	@Override
	protected void onDraw(Canvas canvas) {
		super.onDraw(canvas);
		
		if(touchPoints.size() > 0)
		{
			DashPathEffect effect = new DashPathEffect(new float[] {7,7}, pathEffectPhase);
			PointF midpt = null;
			
			drawingPaint.setPathEffect(effect);
			
			for(int index=1; index<touchPoints.size(); ++index)
			{
				midpt = getMidPoint(
						touchPoints.get(index - 1).x,touchPoints.get(index - 1).y,
						touchPoints.get(index).x,touchPoints.get(index).y);
				
				canvas.drawCircle(
						touchPoints.get(index - 1).x,touchPoints.get(index - 1).y, 
						1, drawingPaint);
				canvas.drawCircle(
						touchPoints.get(index - 1).x,touchPoints.get(index - 1).y, 
						CIRCLE_RADIUS, drawingPaint);
				
				canvas.drawCircle(touchPoints.get(index).x,touchPoints.get(index).y, 
						1, drawingPaint);
				canvas.drawCircle(touchPoints.get(index).x,touchPoints.get(index).y, 
						CIRCLE_RADIUS, drawingPaint);
				
				canvas.drawLine(
						touchPoints.get(index - 1).x,touchPoints.get(index - 1).y,
						touchPoints.get(index).x,touchPoints.get(index).y,
						drawingPaint);
									
				canvas.drawCircle(midpt.x,midpt.y, 10, drawingPaint);
			}
			
			++pathEffectPhase;
					
			invalidate();
		}
	}
	
	@Override
	public boolean onTouchEvent(MotionEvent event) {
		super.onTouchEvent(event);
		
		int action = event.getAction() & MotionEvent.ACTION_MASK;
		
		switch(action)
		{
			case MotionEvent.ACTION_DOWN:
			{
				invalidate();
				
				break;
			}
			case MotionEvent.ACTION_POINTER_DOWN:
			{
				isMultiTouch = true;
				
				setPoints(event);
				invalidate();
								
				break;
			}
			case MotionEvent.ACTION_POINTER_UP:
			{
				isMultiTouch = false;
				
				break;
			}
			case MotionEvent.ACTION_MOVE:
			{
				if(isMultiTouch)
				{
					setPoints(event);
					invalidate();
				}
				
				break;
			}
		}
		
		return true;
	}	
	
	private void initialize(Context context){
		drawingPaint = new Paint();

		drawingPaint.setColor(Color.RED);
		drawingPaint.setStrokeWidth(STROKE_WIDTH);
		drawingPaint.setStyle(Paint.Style.STROKE);
		drawingPaint.setAntiAlias(true);
		
		touchPoints = new ArrayList<PointF>();
	}
	
	public void setPoints(MotionEvent event){
		touchPoints.clear();
		
		int pointerIndex = 0;
		
		for(int index=0; index<event.getPointerCount(); ++index)
		{
			pointerIndex = event.getPointerId(index);
			
			touchPoints.add(new PointF(event.getX(pointerIndex),event.getY(pointerIndex)));
		}
	}

	private PointF getMidPoint(float x1,float y1, float x2, float y2) {
		PointF point = new PointF();
		
		float x = x1 + x2;
		float y = y1 + y2;
		
		point.set(x / 2, y / 2);
		
		return point;
	}
}

 

示例图:

  • 大小: 20.5 KB
分享到:
评论

相关推荐

    Android 多点触摸实例代码

    综上所述,"Android多点触摸实例代码"涉及到的知识点包括:Android触摸事件处理机制、`MotionEvent`类的理解、自定义`GestureDetector`和`GestureListener`、`Matrix`类的应用以及触摸事件的冲突处理。通过深入研究...

    android 多点触摸demo

    本"android 多点触摸demo"旨在为开发者提供一个实践和理解Android多点触摸功能的实例。这个demo适用于运行Android 2.2(API级别8)及更高版本的设备。 Android系统通过`MotionEvent`类来处理触摸事件,包括单点触摸...

    android 2.1 多点触摸演示

    在Android系统中,多点触摸(Multi-Touch)是指设备屏幕能够同时识别并处理两个或更多触点的能力,这是现代智能手机和平板电脑交互的重要特性。Android 2.1版本引入了对多点触摸的支持,使得开发者可以创建更丰富、...

    安卓Android源码——多点触控实例源码.zip

    在安卓(Android)平台上,开发多点触控功能是实现用户交互的重要部分,尤其是在创建复杂的触摸界面时。这个“安卓Android源码——多点触控实例源码.zip”压缩包包含了一个具体的多点触控应用的源代码,可以帮助...

    Android 多点触控实例源码.rar

    这个"Android多点触控实例源码"提供了一个实用的学习资源,帮助开发者深入理解并实践Android中的多点触控技术。以下将详细介绍该源码中的关键知识点。 1. **MotionEvent**:在Android中,处理触摸事件的核心类是`...

    Android多点触控实例源码.rar

    本资源"Android多点触控实例源码.rar"提供了一个具体的实例,帮助开发者了解如何在Android应用中实现多点触控功能。 在Android系统中,处理多点触控主要涉及到`MotionEvent`类和`GestureDetector`类。`MotionEvent`...

    Android 多点触控实例源码.zip

    总之,Android多点触控实例源码提供了一个实际操作的平台,帮助开发者理解和实践多点触控的实现。通过对源码的分析,我们可以学习到如何跟踪和处理多个触摸点,实现复杂的用户交互,如图片的缩放、旋转等。在实际...

    Android 多点触控实例

    一、Android多点触控基础 1. MotionEvent类:在Android中,`MotionEvent`类是用于表示触摸屏幕事件的核心类。它包含了关于触摸事件的所有信息,如动作类型(ACTION_DOWN, ACTION_UP, ACTION_MOVE等)、坐标位置以及...

    Android 多点触控实例源码.zip源码资源下载

    通过下载并研究"Android 多点触控实例源码.zip",开发者不仅可以加深对Android多点触控机制的理解,还能学习到如何在实际项目中实现这些功能,提高应用的用户体验。同时,该源码也适合作为教学材料,帮助初学者快速...

    Android多点触控实例源码.zip

    总的来说,Android多点触控实例源码是一个很好的学习资源,它涵盖了多点触控的基础知识和常见手势的实现方式。通过研究和理解这些源码,开发者可以更好地掌握Android多点触控的实现原理,并将其应用到自己的项目中,...

    多点触摸 ontuch

    5. **示例应用**:一个简单的应用实例,演示了多点触摸功能的实际效果,可以运行在模拟器或真实设备上,便于开发者直观地了解多点触摸的工作原理。 总的来说,这个"muti-touch"资源包对于想要实现多点触摸功能的...

    Android 多点触控实例源码-IT计算机-毕业设计.zip

    这个名为"Android 多点触控实例源码"的压缩包提供了实现这一功能的源代码,对于学习和理解Android多点触控编程具有极大的帮助。 1. **Android多点触控基础** - 触摸事件:Android系统通过`MotionEvent`类处理触摸...

    Android程序研发源码Android 多点触控实例源码.rar

    在本实例中,"Android程序研发源码Android 多点触控实例源码.rar" 提供了一个关于如何实现多点触控功能的具体代码示例。这个压缩包中的"mut_test"可能是项目的主要源代码文件夹,包含了实现多点触控功能的相关类和...

    Android开发之多点触摸(Multitouch)

    在本篇内容中,我们将深入探讨Android多点触摸的实现机制、相关的API以及如何在实践中应用它们。 一、Android多点触摸基础 1. 触摸事件:在Android中,触摸事件主要通过MotionEvent类来处理。MotionEvent包含了...

Global site tag (gtag.js) - Google Analytics