[Android实例] android多点触摸demo .

 

MultiTouchActivity

Java代码  

  1. package com.zhaokai.multitouch;  
  2. import android.app.Activity;  
  3. import android.os.Bundle;  
  4. import android.view.Window;  
  5. import android.view.WindowManager;  
  6.   
  7. public class MultiTouchActivity extends Activity {  
  8.     /** Called when the activity is first created. */  
  9.      /** Called when the activity is first created. */  
  10.     @Override  
  11.     public void onCreate(Bundle savedInstanceState) {  
  12.       super.onCreate(savedInstanceState);            
  13.       //隐藏标题栏            
  14.       requestWindowFeature(Window.FEATURE_NO_TITLE);            
  15.       //设置成全屏           
  16.       getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);            
  17.       //设置为上面的MTView            
  18.       setContentView(new MySurfaceView(this));    
  19.     }  
  20. }  

SurfaceView类: 

Java代码  

  1. package com.zhaokai.multitouch;  
  2.   
  3. import android.content.Context;  
  4. import android.graphics.Canvas;  
  5. import android.graphics.Color;  
  6. import android.graphics.Paint;  
  7. import android.view.MotionEvent;  
  8. import android.view.SurfaceHolder;  
  9. import android.view.SurfaceHolder.Callback;  
  10. import android.view.SurfaceView;  
  11. public class MySurfaceView extends SurfaceView implements Callback{  
  12. private static final int MAX_TOUCHPOINTS = 10;  
  13. private static final String START_TEXT = "请随便触摸屏幕进行测试";        
  14. private Paint textPaint = new Paint();        
  15. private Paint touchPaints[] = new Paint[MAX_TOUCHPOINTS];        
  16. private int colors[] = new int[MAX_TOUCHPOINTS];           
  17. private int width, height;        
  18. private float scale = 1.0f;  
  19.   
  20. public MySurfaceView(Context context) {  
  21.   super(context);  
  22.   SurfaceHolder holder = getHolder();            
  23.   holder.addCallback(this);            
  24.   setFocusable(true); // 确保我们的View能获得输入焦点            
  25.   setFocusableInTouchMode(true); // 确保能接收到触屏事件            
  26.   init();    
  27. }  
  28. public void init(){  
  29.   // 初始化10个不同颜色的画笔            
  30.   textPaint.setColor(Color.WHITE);    
  31.   colors[0] = Color.BLUE;    
  32.   colors[1] = Color.RED;  
  33.   colors[2] = Color.GREEN;  
  34.   colors[3] = Color.YELLOW;  
  35.   colors[4] = Color.CYAN;  
  36.   colors[5] = Color.MAGENTA;  
  37.   colors[6] = Color.DKGRAY;  
  38.   colors[7] = Color.WHITE;  
  39.   colors[8] = Color.LTGRAY;  
  40.   colors[9] = Color.GRAY;  
  41.   for(int i=0;i<MAX_TOUCHPOINTS;i++){  
  42.    touchPaints[i]=new Paint();  
  43.    touchPaints[i].setColor(colors[i]);  
  44.   }  
  45. }  
  46.   
  47. @Override  
  48. public boolean onTouchEvent(MotionEvent event) {  
  49.   int pointerCount=event.getPointerCount();  
  50.   if(pointerCount>MAX_TOUCHPOINTS){  
  51.    pointerCount=MAX_TOUCHPOINTS;  
  52.   }  
  53.   Canvas c=getHolder().lockCanvas();  
  54.   if(c!=null){  
  55.    c.drawColor(Color.BLACK);  
  56.    if(event.getAction()==MotionEvent.ACTION_UP){  
  57.     // 当手离开屏幕时,清屏  
  58.     c.drawColor(Color.BLACK);  
  59.    }else{  
  60.      // 先在屏幕上画一个十字,然后画一个圆  
  61.     for(int i=0;i<pointerCount;i++){  
  62.      //获取一个触点的坐标,然后开始绘制  
  63.      int id=event.getPointerId(i);  
  64.      int x=(int)event.getX(i);  
  65.      int y=(int)event.getY(i);  
  66.      drawCrosshairsAndText(x, y, touchPaints[id], i, id, c);  
  67.     }  
  68.     for(int i=0;i<pointerCount;i++){  
  69.      int id=event.getPointerId(i);  
  70.      int x=(int)event.getX(i);  
  71.      int y=(int)event.getY(i);  
  72.      drawCircle(x, y, touchPaints[id],c);  
  73.     }  
  74.    }  
  75.    getHolder().unlockCanvasAndPost(c);  
  76.   }  
  77.   return true;  
  78. }  
  79.   
  80. private void drawCrosshairsAndText(int x, int y, Paint paint, int ptr,int id, Canvas c) {  
  81.   c.drawLine(0, y, width, y, paint);            
  82.   c.drawLine(x, 0, x, height, paint);            
  83.   int textY = (int) ((15 + 20 * ptr) * scale);            
  84.   c.drawText("x" + ptr + "=" + x, 10 * scale, textY, textPaint);            
  85.   c.drawText("y" + ptr + "=" + y, 70 * scale, textY, textPaint);            
  86.   c.drawText("id" + ptr + "=" + id, width - 55 * scale, textY, textPaint);     
  87. }    
  88.   
  89. private void drawCircle(int x, int y, Paint paint, Canvas c) {  
  90.   c.drawCircle(x, y, 40 * scale, paint);        
  91. }    
  92.   
  93. @Override  
  94. public void surfaceChanged(SurfaceHolder holder, int format, int width,  
  95.    int height) {  
  96.    this.width = width;            
  97.    this.height = height;            
  98.    if (width > height){                
  99.     this.scale = width / 480f;            
  100.    } else {  
  101.    this.scale = height / 480f;            
  102.    }            
  103.    textPaint.setTextSize(14 * scale);            
  104.    Canvas c = getHolder().lockCanvas();            
  105.    if (c != null) {              // 背景黑色                
  106.     c.drawColor(Color.BLACK);                
  107.     float tWidth = textPaint.measureText(START_TEXT);                
  108.     c.drawText(START_TEXT, width / 2 - tWidth / 2, height / 2,textPaint);                
  109.     getHolder().unlockCanvasAndPost(c);            
  110.   }    
  111. }  
  112. @Override  
  113. public void surfaceCreated(SurfaceHolder holder) {  
  114.   // TODO Auto-generated method stub  
  115.     
  116. }  
  117. @Override  
  118. public void surfaceDestroyed(SurfaceHolder holder) {  
  119.   // TODO Auto-generated method stub  
  120.     
  121. }   
  122.   
  123. }  
时间: 2024-11-02 20:39:47

[Android实例] android多点触摸demo .的相关文章

解析Android开发中多点触摸的实现方法_Android

多点触摸技术在实际开发过程中,用的最多的就是放大缩小功能.比如有一些图片浏览器,就可以用多个手指在屏幕上操作,对图片进行放大或者缩小.再比如一些浏览器,也可以通过多点触摸放大或者缩小字体.其实放大缩小也只是多点触摸的实际应用样例之一,有了多点触摸技术,在一定程度上就可以创新出更多的操作方式来,实现更酷的人机交互. 理论上,Android系统本身可以处理多达256个手指的触摸,这主要取决于手机硬件的支持.当然,支持多点触摸的手机,也不会支持这么多点,一般是支持2个点或者4个点.对于开发者来说,编写

解析Android开发中多点触摸的实现方法

多点触摸技术在实际开发过程中,用的最多的就是放大缩小功能.比如有一些图片浏览器,就可以用多个手指在屏幕上操作,对图片进行放大或者缩小.再比如一些浏览器,也可以通过多点触摸放大或者缩小字体.其实放大缩小也只是多点触摸的实际应用样例之一,有了多点触摸技术,在一定程度上就可以创新出更多的操作方式来,实现更酷的人机交互. 理论上,Android系统本身可以处理多达256个手指的触摸,这主要取决于手机硬件的支持.当然,支持多点触摸的手机,也不会支持这么多点,一般是支持2个点或者4个点.对于开发者来说,编写

android多点触摸demo

 MultiTouchActivity Java代码    package com.zhaokai.multitouch;   import android.app.Activity;   import android.os.Bundle;   import android.view.Window;   import android.view.WindowManager;      public class MultiTouchActivity extends Activity {       

Android编程开发之多点触摸(Multitouch)实现方法_Android

本文实例讲述了Android编程开发之多点触摸(Multitouch)实现方法.分享给大家供大家参考,具体如下: 如果您对开发多点触摸程序感兴趣的话,那么本文将是一个很好的开始,android应用程序开发中,多点触摸不是那么遥不可及,实现起来也很简单,本例只需要两个类就能实现多点触摸. 首先来看看我们的视图类MTView.java: package com.ideasandroid.demo; import android.content.Context; import android.grap

Android编程开发之多点触摸(Multitouch)实现方法

本文实例讲述了Android编程开发之多点触摸(Multitouch)实现方法.分享给大家供大家参考,具体如下: 如果您对开发多点触摸程序感兴趣的话,那么本文将是一个很好的开始,android应用程序开发中,多点触摸不是那么遥不可及,实现起来也很简单,本例只需要两个类就能实现多点触摸. 首先来看看我们的视图类MTView.java: package com.ideasandroid.demo; import android.content.Context; import android.grap

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

布局: 复制代码 代码如下: <?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:id="@+id/relativeLayout1"    android:layout_width="fill_parent

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

布局: 复制代码 代码如下:<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:id="@+id/relativeLayout1"    android:layout_width="fill_parent&

Android实现手势滑动多点触摸缩放平移图片效果_Android

现在app中,图片预览功能肯定是少不了的,用户基本已经形成条件反射,看到小图,点击看大图,看到大图两个手指开始进行放大,放大后,开始移动到指定部位.一.概述想要做到图片支持多点触控,自由的进行缩放.平移,需要了解几个知识点:Matrix , GestureDetector , ScaleGestureDetector 以及事件分发机制,ps:不会咋办,不会你懂的.1.Matrix 矩阵,看深入了都是3维矩阵的乘啊什么的,怪麻烦的~~ 其实这么了解下就行了: Matrix数据结构:3维矩阵:内部存

Android实现手势滑动多点触摸放大缩小图片效果_Android

网上文章虽多,但是这种效果少之又少,我真诚的献上以供大家参考 实现原理:自定义ImageView对此控件进行相应的layout(动态布局). 这里你要明白几个方法执行的流程: 首先ImageView是继承自View的子类.onLayout方法:是一个回调方法.该方法会在在View中的layout方法中执行,在执行layout方法前面会首先执行setFrame方法.setFrame方法:判断我们的View是否发生变化,如果发生变化,那么将最新的l,t,r,b传递给View,然后刷新进行动态更新UI