`
yoyotota
  • 浏览: 63834 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

[Android实例] android多点触摸demo

阅读更多
MultiTouchActivity
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 {
    /** Called when the activity is first created. */
	 /** Called when the activity is first created. */
    @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 MySurfaceView(this));  
    }
}


SurfaceView类:

package com.zhaokai.multitouch;

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.SurfaceHolder.Callback;
import android.view.SurfaceView;
public class MySurfaceView extends SurfaceView implements 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 MySurfaceView(Context context) {
  super(context);
  SurfaceHolder holder = getHolder();          
  holder.addCallback(this);          
  setFocusable(true); // 确保我们的View能获得输入焦点          
  setFocusableInTouchMode(true); // 确保能接收到触屏事件          
  init();  
}
public 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 c=getHolder().lockCanvas();
  if(c!=null){
   c.drawColor(Color.BLACK);
   if(event.getAction()==MotionEvent.ACTION_UP){
    // 当手离开屏幕时,清屏
    c.drawColor(Color.BLACK);
   }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) ((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);      
}  

@Override
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);          
  }  
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
  // TODO Auto-generated method stub
  
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
  // TODO Auto-generated method stub
  
} 

}

分享到:
评论

相关推荐

    android 多点触摸demo

    本"android 多点触摸demo"旨在为开发者提供一个实践和理解Android多点触摸功能的实例。这个demo适用于运行Android 2.2(API级别8)及更高版本的设备。 Android系统通过`MotionEvent`类来处理触摸事件,包括单点触摸...

    Demo 多点触摸 缩放 图片

    总结起来,“Demo 多点触摸 缩放 图片”是一个展示如何在移动应用中实现图片多点触摸缩放功能的实例。通过监听多点触摸事件,计算手势变化,以及调整图片的缩放属性,我们可以创建出用户友好的图像查看体验。无论是...

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

    本文实例讲述了Android编程开发之多点触摸(Multitouch)实现方法。分享给大家供大家参考,具体如下: 如果您对开发多点触摸程序感兴趣的话,那么本文将是一个很好的开始,android应用程序开发中,多点触摸不是那么遥...

    Android应用源码之多点缩放字体DEMO.zip

    通过以上知识点的运用,"Android应用源码之多点缩放字体DEMO"提供了一个实用的示例,帮助开发者学习如何在Android应用中实现流畅的字体缩放功能。通过研究这个DEMO,开发者可以更好地理解和掌握Android手势识别、...

    Android应用源码之多点缩放字体DEMO .zip

    这个"Android应用源码之多点缩放字体DEMO"提供了一个实例,帮助开发者理解如何在Android应用中实现字体大小的动态调整。以下是基于这个DEMO的关键知识点的详细说明: 1. **AndroidManifest.xml**: 这是每个Android...

    Android 多点缩放字体DEMO源码 .rar

    在Android开发中,多点...这个DEMO提供了学习和实践Android多点缩放字体的实例,对于理解Android手势检测和动态调整界面元素的大小具有很高的参考价值。开发者可以通过阅读源码,了解如何将这些概念应用于实际项目中。

    安卓Android源码——多点缩放字体DEMO.zip

    这份"安卓Android源码——多点缩放字体DEMO.zip"包含了一个演示如何实现这一功能的实例。以下是对这个DEMO中涉及的关键知识点的详细解释: 1. **Android源码**:源码是应用的基础,它揭示了程序的工作原理和结构。...

    Android 多点缩放字体DEMO .zip

    本DEMO是一个专门展示如何在Android应用程序中实现多点触控缩放字体的实例。 源码分析: 1. `proguard.cfg`:这是ProGuard配置文件,用于在构建过程中优化、混淆和压缩Java代码,以减少APK的大小并提高安全性能。...

    Android多点触控技术实战,对图片进行缩放和移动Demo

    总之,Android多点触控技术是提升用户体验的重要手段,理解和熟练掌握相关API和手势检测器的使用,可以让你的Android应用更具交互性和趣味性。通过深入研究"PhotoWallFallsDemo"的代码,开发者可以更好地理解如何将...

    Android高级应用源码-多点触控控制字体大小,源码中有详细注释,简单Demo.zip

    总的来说,这个Demo涵盖了Android多点触控事件的处理和UI动态更新,对于开发者来说,这是一个很好的学习实例,可以帮助他们理解如何在实际应用中实现类似的功能。通过研究源码,开发者不仅可以掌握多点触控的基本...

    应用源码之多点缩放字体DEMO.zip

    总之,这个DEMO提供了一个学习Android多点缩放字体的实例,涵盖了触摸事件处理、手势识别、视图矩阵变换以及布局管理等多个核心知识点,对于进行Android UI交互设计和代码学习的开发者来说具有很高的参考价值。...

    Android应用源码之多点触控控制字体大小,源码中有详细注释,简单Demo.zip

    通过这个源码,开发者可以学习到Android多点触控事件处理、手势识别、动态调整UI元素属性等技术,这些对于构建更高级、交互性更强的Android应用至关重要。同时,详细注释使得源码成为初学者和进阶者学习Android开发...

    Android单点平移多点缩放旋转Demo

    在Android开发中,实现平移、缩放和旋转功能通常...总之,这个Demo为开发者提供了一个实现Android视图平移、缩放和旋转的实例,通过学习和分析这个项目,你可以掌握如何在自己的应用中实现类似的功能,提升用户体验。

    安卓Android源码——多点触控控制字体大小,源码中有详细注释,简单Demo.zip

    提供的Demo是一个简洁的应用实例,它可能包含一个简单的Activity和布局文件,其中有一个TextView用于展示多点触控改变字体大小的效果。开发者可以通过运行这个Demo来直观地感受多点触控的功能,并根据源码学习其...

    图片缩放Demo

    总结,这个“图片缩放Demo”主要涵盖了Android图片处理、多点触摸事件处理、自定义`ImageView`以及矩阵变换等多个核心知识点,对于需要在应用中实现图片缩放功能的开发者来说,是一个非常有价值的参考示例。

Global site tag (gtag.js) - Google Analytics