Android多点触控开发原理
16lz
2022-06-25
Android多点触控在本质上需要LCD驱动和程序本身设计上支持,目前市面上HTC、Motorola和Samsung等知名厂商只要使用电容屏触控原理的手机均可以支持多点触控Multitouch技术,对于网页缩放、手势操作上有更好的用户体验。 在Android平台上事件均使用了MotionEvent对象方式处理,比如开始触控时会触发ACTION_DOWN而移动操作时为ACTION_MOVE最终放开手指时触发ACTION_UP事件。当然还有用户无规则的操作可能触发ACTION_CANCEL这个动作。
首先Android开发网提醒大家多点触控需要LCD驱动和应用软件两个支持才能实现,所以部分比较老的,比如Android 2.1以前或在北美上市的手机可能无法支持多点触控在固件上,由于Apple专利原因在欧洲和亚太地区的Android 2.1以后的新款机型固件均已经在屏幕驱动中支持,同时模拟器也无法实现多点触控的测试。
下面Android123一起用Android 2.0或以上SDK中的方法来实现如何通过应用层支持多点触控操作,对于常规的控件触控操作在内部为View的setOnTouchListener()接口实现的onTouchEvent()方法来处理。对于onTouchEvent方法的参数MotionEvent我们可以详细处理来实现对多点触控的了解,比如
event.getAction() //获取触控动作比如ACTION_DOWN
event.getPointerCount(); //获取触控点的数量,比如2则可能是两个手指同时按压屏幕
event.getPointerId(nID); //对于每个触控的点的细节,我们可以通过一个循环执行getPointerId方法获取索引
event.getX(nID); //获取第nID个触控点的x位置
event.getY(nID); //获取第nID个点触控的y位置
event.getPressure(nID); //LCD可以感应出用户的手指压力,当然具体的级别由驱动和物理硬件决定的
event.getDownTime() //按下开始时间
event.getEventTime() // 事件结束时间
event.getEventTime()-event.getDownTime()); //总共按下时花费时间
有关Android多点触控的更详细技术由于目前兼容性和固件问题android123将会在以后的内容中详细讨论,这里给大家起到抛砖引玉的作用。
实例:
Java代码
Activity:
Java代码
首先Android开发网提醒大家多点触控需要LCD驱动和应用软件两个支持才能实现,所以部分比较老的,比如Android 2.1以前或在北美上市的手机可能无法支持多点触控在固件上,由于Apple专利原因在欧洲和亚太地区的Android 2.1以后的新款机型固件均已经在屏幕驱动中支持,同时模拟器也无法实现多点触控的测试。
下面Android123一起用Android 2.0或以上SDK中的方法来实现如何通过应用层支持多点触控操作,对于常规的控件触控操作在内部为View的setOnTouchListener()接口实现的onTouchEvent()方法来处理。对于onTouchEvent方法的参数MotionEvent我们可以详细处理来实现对多点触控的了解,比如
event.getAction() //获取触控动作比如ACTION_DOWN
event.getPointerCount(); //获取触控点的数量,比如2则可能是两个手指同时按压屏幕
event.getPointerId(nID); //对于每个触控的点的细节,我们可以通过一个循环执行getPointerId方法获取索引
event.getX(nID); //获取第nID个触控点的x位置
event.getY(nID); //获取第nID个点触控的y位置
event.getPressure(nID); //LCD可以感应出用户的手指压力,当然具体的级别由驱动和物理硬件决定的
event.getDownTime() //按下开始时间
event.getEventTime() // 事件结束时间
event.getEventTime()-event.getDownTime()); //总共按下时花费时间
有关Android多点触控的更详细技术由于目前兼容性和固件问题android123将会在以后的内容中详细讨论,这里给大家起到抛砖引玉的作用。
实例:
Java代码
- packagecom.ideasandroid.demo;
- importandroid.content.Context;
- importandroid.graphics.Canvas;
- importandroid.graphics.Color;
- importandroid.graphics.Paint;
- importandroid.view.MotionEvent;
- importandroid.view.SurfaceHolder;
- importandroid.view.SurfaceView;
- publicclassMTViewextendsSurfaceViewimplementsSurfaceHolder.Callback{
- privatestaticfinalintMAX_TOUCHPOINTS=10;
- privatestaticfinalStringSTART_TEXT="请随便触摸屏幕进行测试";
- privatePainttextPaint=newPaint();
- privatePainttouchPaints[]=newPaint[MAX_TOUCHPOINTS];
- privateintcolors[]=newint[MAX_TOUCHPOINTS];
- privateintwidth,height;
- privatefloatscale=1.0f;
- publicMTView(Contextcontext){
- super(context);
- SurfaceHolderholder=getHolder();
- holder.addCallback(this);
- setFocusable(true);//确保我们的View能获得输入焦点
- setFocusableInTouchMode(true);//确保能接收到触屏事件
- init();
- }
- privatevoidinit(){
- //初始化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(inti=0;i<MAX_TOUCHPOINTS;i++){
- touchPaints[i]=newPaint();
- touchPaints[i].setColor(colors[i]);
- }
- }
- /*
- *处理触屏事件
- */
- @Override
- publicbooleanonTouchEvent(MotionEventevent){
- //获得屏幕触点数量
- intpointerCount=event.getPointerCount();
- if(pointerCount>MAX_TOUCHPOINTS){
- pointerCount=MAX_TOUCHPOINTS;
- }
- //锁定Canvas,开始进行相应的界面处理
- Canvasc=getHolder().lockCanvas();
- if(c!=null){
- c.drawColor(Color.BLACK);
- if(event.getAction()==MotionEvent.ACTION_UP){
- //当手离开屏幕时,清屏
- }else{
- //先在屏幕上画一个十字,然后画一个圆
- for(inti=0;i<pointerCount;i++){
- //获取一个触点的坐标,然后开始绘制
- intid=event.getPointerId(i);
- intx=(int)event.getX(i);
- inty=(int)event.getY(i);
- drawCrosshairsAndText(x,y,touchPaints[id],i,id,c);
- }
- for(inti=0;i<pointerCount;i++){
- intid=event.getPointerId(i);
- intx=(int)event.getX(i);
- inty=(int)event.getY(i);
- drawCircle(x,y,touchPaints[id],c);
- }
- }
- //画完后,unlock
- getHolder().unlockCanvasAndPost(c);
- }
- returntrue;
- }
- /**
- *画十字及坐标信息
- *
- *@paramx
- *@paramy
- *@parampaint
- *@paramptr
- *@paramid
- *@paramc
- */
- privatevoiddrawCrosshairsAndText(intx,inty,Paintpaint,intptr,
- intid,Canvasc){
- c.drawLine(0,y,width,y,paint);
- c.drawLine(x,0,x,height,paint);
- inttextY=(int)((15+20*ptr)*scale);
- c.drawText("x"+ptr+"="+x,10*scale,textY,
- c.drawText("y"+ptr+"="+y,70*scale,textY,
- c.drawText("id"+ptr+"="+id,width-55*sc
- }
- /**
- *画圆
- *
- *@paramx
- *@paramy
- *@parampaint
- *@paramc
- */
- privatevoiddrawCircle(intx,inty,Paintpaint,Canvasc
- c.drawCircle(x,y,40*scale,paint);
- }
- /*
- *进入程序时背景画成黑色,然后把“START_TEXT”写到屏幕
- */
- publicvoidsurfaceChanged(SurfaceHolderholder,intformat,i
- intheight){
- this.width=width;
- this.height=height;
- if(width>height){
- this.scale=width/480f;
- }else{
- this.scale=height/480f;
- }
- textPaint.setTextSize(14*scale);
- Canvasc=getHolder().lockCanvas();
- if(c!=null){
- //背景黑色
- c.drawColor(Color.BLACK);
- floattWidth=textPaint.measureText(START_TEXT);
- c.drawText(START_TEXT,width/2-tWidth/2
- textPaint);
- getHolder().unlockCanvasAndPost(c);
- }
- }
- publicvoidsurfaceCreated(SurfaceHolderholder){
- }
- publicvoidsurfaceDestroyed(SurfaceHolderholder){
- }
- }
Activity:
Java代码
- packagecom.ideasandroid.demo;
- importandroid.app.Activity;
- importandroid.os.Bundle;
- importandroid.view.Window;
- importandroid.view.WindowManager;
- publicclassMultitouchVisibleextendsActivity{
- @Override
- publicvoidonCreate(BundlesavedInstanceState){
- super.onCreate(savedInstanceState);
- //隐藏标题栏
- requestWindowFeature(Window.FEATURE_NO_TITLE);
- //设置成全屏
- getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
- WindowManager.LayoutParams.FLAG_FULLSCREEN);
- //设置为上面的MTView
- setContentView(newMTView(this));
- }
- }
更多相关文章
- 开始折腾ipad mini 3
- Android(安卓)获取ROOT权限原理解析
- Android引路蜂地图开发示例:概述
- android获取正在运行的应用程序
- Android(安卓)蓝牙开发基本流程
- DIY Android之一--原生Android系统主题支持的设计和实现
- Android(安卓)solve设备(手机)旋转过程中出现程序中断问题
- 使用Android内部的DownloadProvider下载文件,并获取cache权限
- android之文件上传