`
windy71
  • 浏览: 2531 次
  • 来自: ...
最近访客 更多访客>>
社区版块
存档分类
最新评论

【转】Android开发中实现多点触摸的方法

阅读更多
原文地址:http://mobile.51cto.com/hot-235078.htm

我们曾就《Android手势识别ViewFlipper触摸动画》做过详细的讲解,其实,Android应用程序开发中,多点触摸(Multitouch)不是那么遥不可及,实现起来也很简单。如果您对开发多点触摸程序感兴趣的话,那么本文将是一个很好的开始,本例只需要两个类就能实现多点触摸。
首先来看看我们的视图类MTView.java:
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, textPaint);  
        c.drawText("y" + ptr + "=" + y, 70 * scale, textY, textPaint);  
        c.drawText("id" + ptr + "=" + id, width - 55 * scale, textY, textPaint);  
    }  
   
    /**  
     * 画圆  
     *  
     * @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, intwidth,  
            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, height / 2,  
                    textPaint);  
            getHolder().unlockCanvasAndPost(c);  
        }  
    }  
   
    public void surfaceCreated(SurfaceHolder holder) {  
    }  
   
    public void surfaceDestroyed(SurfaceHolder holder) {  
    }  
   
}  

接下来看看我们的Activity,MultitouchVisible.java
    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));  
        }  
    } 


分享到:
评论

相关推荐

    android支持多点触摸的DEMO

    这个“android支持多点触摸的DEMO”是专门为开发者提供的一个示例项目,它展示了如何在Android应用程序中实现多点触摸功能。这个DEMO可以在Eclipse集成开发环境中编译并运行,以验证多点触摸功能的正确性和有效性。 ...

    android 2.1 多点触摸演示

    多点触摸技术在Android应用开发中有广泛的应用,如: - 图片查看器:通过双指缩放实现图片放大缩小。 - 游戏:控制角色移动、射击等操作。 - 地图应用:通过双指滑动实现地图的平移和缩放。 - 演示文稿:支持手势...

    Android多点触摸示例源代码

    在多点触摸中,常见的手势包括捏合缩放、旋转、平移等。例如,双指捏合通常用于图片的缩放操作,两指旋转用于图像的旋转,而单指滑动则用于界面的滚动。在`DoubleTouchDemo`中,可能实现了类似的功能。 1. 捏合缩放...

    stm32 USB HID多点触摸屏上报安卓触摸信号

    在这个项目中,STM32作为主控芯片,通过配置其USB接口为HID模式,能够模拟手指触摸,并向Android设备发送多点触摸信号。以下将详细阐述这个过程中的关键知识点。 首先,STM32是意法半导体推出的一种基于ARM Cortex-...

    android 2.2 开始的多点触摸示例

    本示例将深入探讨如何在Android应用中实现多点触摸功能,以创建更加丰富、直观的用户体验。 多点触摸的基本原理是通过监听`MotionEvent`事件来获取屏幕上同时发生的触摸动作。Android的`MotionEvent`类包含了处理...

    Android开发之多点触摸(Multitouch)

    在Android应用开发中,多点触摸(Multitouch)是一项重要的功能,允许用户通过两个或更多的手指同时与屏幕交互,提供了更加丰富的用户界面体验。在本篇内容中,我们将深入探讨Android多点触摸的实现机制、相关的API...

    android多点触摸实例及疑问

    在Android开发中,多点触摸(Multi-Touch)功能是一个重要的特性,它允许用户通过两个或更多的手指同时与屏幕交互,实现缩放、旋转、滑动等手势操作。本实例将深入探讨Android多点触摸的实现,并解答相关疑问。 ...

    Android 2.3 向系统发送多点触摸事件

    通过以上步骤,开发者可以在Android 2.3中实现复杂的多点触摸功能。`MotionEventDemo`这个示例项目很可能包含了上述概念的实际应用,你可以通过查看源代码来学习具体的实现细节,例如如何解析和响应`MotionEvent`...

    在网页中实现多点触摸EightMedia

    总的来说,EightMedia-hammer.js为Web开发者提供了一个强大而灵活的工具,用于在网页中实现多点触摸交互,结合jQuery的便利性,使得开发高性能、高互动性的触摸应用变得更加简单。通过理解和熟练运用这些知识点,...

    游戏杆模拟的多点触摸的实现

    在Android开发中,游戏杆模拟多点触摸是一种高级的技术应用,它可以为用户提供更丰富的交互体验。游戏杆模拟的多点触摸实现主要涉及到两个关键概念:游戏杆输入处理和多点触摸事件管理。以下是对这两个核心知识点的...

    多点触摸 ontuch

    1. **示例代码**:这部分代码展示了如何在应用程序中实现多点触摸功能,包括监听触摸事件、解析手势以及更新界面等步骤。开发者可以通过阅读和理解这些代码,学习如何在自己的项目中集成多点触摸功能。 2. **库文件...

    Android屏幕多点触摸

    在本篇内容中,我们将深入探讨如何实现Android屏幕的多点触摸功能,并进行相关的测试。 首先,理解Android中的触摸事件处理机制是至关重要的。Android通过MotionEvent类来处理触摸事件,这个类封装了用户的触摸行为...

    android 多点触摸图片缩放的具体实现方法

    在Android开发中,多点触摸功能常常用于图片的缩放和平移操作,为用户提供更加直观和自然的交互体验。在本篇文章中,我们将探讨如何在Android应用中实现多点触摸图片缩放的具体方法。 首先,我们需要创建一个可以...

    Android多点触摸 源代码

    通过在Linux内核中定义多点触摸相关的软件位,以及在Android框架层中提供相应的接口和支持,实现了对多点触摸屏的有效识别和利用。对于开发者而言,了解这些底层原理有助于更好地开发出支持多点触摸的应用程序,提升用户...

    【Android基础】(11)多点触摸交互处理

    在Android开发中,多点触摸(Multi-Touch)交互处理是一项关键技能,它使得用户能够通过同时使用两个或更多的手指来与设备进行更复杂的交互,如缩放、旋转、平移等手势。本教程将深入探讨如何在Android应用中实现...

    ndroid游戏开发之单点触摸与多点触摸的响应方式

    在Android游戏开发中,触摸事件处理是至...总之,理解并熟练掌握Android中的单点触摸和多点触摸处理,是Android游戏开发中的重要技能。通过合理的事件处理和手势识别,开发者能够创造出更具互动性和趣味性的游戏作品。

    Android应用源码之单点与多点触摸.zip

    总之,"Android应用源码之单点与多点触摸.zip"中的内容涵盖了Android触摸事件处理的基本概念和实现方式,对于开发者来说,这是一份很好的学习资料。通过深入研究和实践这些源码,不仅可以掌握基本的触摸事件处理,还...

    android 图片缩放和多点触摸源码.rar

    在Android开发中,图片处理和用户交互是两个非常重要的方面,尤其在开发图像查看器或者画廊应用时,图片的缩放和多点触摸功能更是不可或缺。本项目"android 图片缩放和多点触摸源码"正是针对这两个功能进行实现的...

    Multitouch 多点触摸ImageView效果

    在Android开发中,多点触摸(Multitouch)功能是一个重要的交互方式,它允许用户同时使用两个或更多个手指来操作界面元素,如放大、缩小、旋转等。本项目聚焦于在ImageView上实现多点触摸的缩放效果,并结合Gallery...

    Android手机屏幕截图和图片多点触摸缩放

    在Android开发中,为了实现图片的多点触摸缩放,通常会使用`GestureDetector`和`ScaleGestureDetector`这两个类。`GestureDetector`处理单击、双击等基本手势,而`ScaleGestureDetector`则专门处理缩放手势。以下是...

Global site tag (gtag.js) - Google Analytics