Android开发之多点触摸(Multitouch)
生活随笔
收集整理的這篇文章主要介紹了
Android开发之多点触摸(Multitouch)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
轉自: http://www.ideasandroid.com/archives/tag/surfaceview
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,?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)?{
????}
}
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應用程序開發中,多點觸摸不是那么遙不可及,實現起來也很簡單,本例只需要兩個類就能實現多點觸摸。
首先來看看我們的視圖類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,?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)?{
????}
}
?
?
代碼中都做了相應的注釋,這里就不多說。?? ? ? ?接下來看看我們的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));
????}
}
轉載于:https://www.cnblogs.com/KiloNet/archive/2011/03/29/1999238.html
新人創作打卡挑戰賽發博客就能抽獎!定制產品紅包拿不停!總結
以上是生活随笔為你收集整理的Android开发之多点触摸(Multitouch)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [转载]android一些、面试题
- 下一篇: 主线程等待一个 无阻塞函数 死循环子线程