生活随笔
收集整理的這篇文章主要介紹了
Android开发实例之多点触控程序
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
? ? ?智能終端設備的多點觸控操作為我們帶來了種種炫酷體驗,這也使得很多Android開發者都對多點觸控程序的開發感興趣。實際上多點觸控程序的實現并不是那么遙不可及,而是比較容易。本文就主要通過一個實例具體講解多點觸控程序的實現。
???????首先來了解一下Android中多點觸控的原理。
?????? Android多點觸控在本質上需要LCD驅動和程序本身設計上支持,目前市面上HTC、Motorola和Samsung等知名廠商只要使用電容屏觸控原理的手機均可以支持多點觸控Multitouch技術,對于網頁縮放、手勢操作上有更好的用戶體驗。 在Android平臺上事件均使用了MotionEvent對象方式處理,比如開始觸控時會觸發ACTION_DOWN,而移動操作時為ACTION_MOVE,最終放開手指時觸發ACTION_UP事件。當然還有用戶無規則的操作可能觸發ACTION_CANCEL這個動作。
?????? 對于常規的觸控操作我們都是使用內部為View的setOnTouchListener()接口實現的onTouchEvent()方法來處理。因此對于onTouchEvent方法的參數MotionEvent我們需要有一定得了解,比如:
Java代碼
event.getAction()?event.getPointerCount();?event.getPointerId(nID);?event.getX(nID);?event.getY(nID);?event.getPressure(nID);?event.getDownTime()?event.getEventTime()?event.getEventTime()-event.getDownTime());? ??????下面,我們根據一個項目來講解如何實現多點觸控。
??????在上代碼之前先來看看此實例的運行效果圖:
?????? 以下是實現步驟:
?????? 1、創建一個Android項目,命名為MultitouchVisible。
?????? 2、在該項目內,新建一個view,繼承SurfaceView,并實現了Callback接口,這里我們命名該類為MyView.java,下面是該類地具體實現代碼:
Java代碼
public?class?MyView?extends?SurfaceView?implements?SurfaceHolder.Callback{ ??????MultitouchVisible?father; ?????? ??????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;?? ?????? ??????public?MyView(MultitouchVisible?father)?{ ??????????super(father); ??????????????????this.father=father; ??????????SurfaceHolder?holder?=?getHolder();?? ??????????holder.addCallback(this);?? ??????????setFocusable(true);?????????setFocusableInTouchMode(true);?????????init();?? ??????} ???????private?void?init()?{?? ????????????????????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?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);? ???????????????????} ??????????????} ???????????????????????????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)?(5?+?20?*?ptr);?? ???????????c.drawText("x"?+?ptr?+?"="?+?x,?10?,?textY,?textPaint);?? ???????????c.drawText("y"?+?ptr?+?"="?+?y,?70?,?textY,?textPaint);?? ???????????c.drawText("id"?+?ptr?+?"="?+?id,?width?-?55?,?textY,?textPaint);? ???????}?? ???????????private?void?drawCircle(int?x,?int?y,?Paint?paint,?Canvas?c)?{?? ???????????c.drawCircle(x,?y,?40?,?paint);?? ???????}?? ??????@Override??????public?void?surfaceChanged(SurfaceHolder?holder,?int?format,?int?width, ??????????????int?height)?{ ??????????????????this.width?=?width;?? ??????????this.height?=?height;?? ??????????textPaint.setTextSize(14);?? ??????????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);?? ??????????}?? ??????} ??????@Override??????public?void?surfaceCreated(SurfaceHolder?holder)?{ ?????????????????? ??????} ????????@Override??????public?void?surfaceDestroyed(SurfaceHolder?holder)?{ ?????????????????? ??????} ??}?? ??????3、修改主Activity類,把該view放到setContentView()中顯示,具體實現如下:
Java代碼
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);?? ??????????????????setContentView(new?MyView(this));?? ??????} ??}?? ?????? 4、到此,項目已經完成,可見多點觸控實現起來并不難!運行此實例程序就能得到如上面效果圖中的界面。
轉載于:https://www.cnblogs.com/xiaochao1234/p/3834019.html
總結
以上是生活随笔為你收集整理的Android开发实例之多点触控程序的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。