天天看點

Android開發之多點觸摸(Multitouch)

   如果您對開發多點觸摸程式感興趣的話,那麼本文将是一個很好的開始,android應用程式開發中,多點觸摸不是那麼遙不可及,實作起來也很簡單,本例隻需要兩個類就能實作多點觸摸。

首先來看看我們的視圖類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;

    }

    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);

    }

    private void drawCircle(int x, int y, Paint paint, Canvas c) {

        c.drawCircle(x, y, 40 * scale, paint);

    }

    public void surfaceChanged(SurfaceHolder holder, int format, int width,

            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) {

    }

}

  好了,就這麼簡單,有不明白的請留言!

        希望本文對您有所幫助。

下載下傳:http://download.csdn.net/detail/penglijiang/4350891