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 2.2(API级别8)及更高版本的设备。 Android系统通过`MotionEvent`类来处理触摸事件,包括单点触摸...
总结起来,“Demo 多点触摸 缩放 图片”是一个展示如何在移动应用中实现图片多点触摸缩放功能的实例。通过监听多点触摸事件,计算手势变化,以及调整图片的缩放属性,我们可以创建出用户友好的图像查看体验。无论是...
本文实例讲述了Android编程开发之多点触摸(Multitouch)实现方法。分享给大家供大家参考,具体如下: 如果您对开发多点触摸程序感兴趣的话,那么本文将是一个很好的开始,android应用程序开发中,多点触摸不是那么遥...
通过以上知识点的运用,"Android应用源码之多点缩放字体DEMO"提供了一个实用的示例,帮助开发者学习如何在Android应用中实现流畅的字体缩放功能。通过研究这个DEMO,开发者可以更好地理解和掌握Android手势识别、...
这个"Android应用源码之多点缩放字体DEMO"提供了一个实例,帮助开发者理解如何在Android应用中实现字体大小的动态调整。以下是基于这个DEMO的关键知识点的详细说明: 1. **AndroidManifest.xml**: 这是每个Android...
在Android开发中,多点...这个DEMO提供了学习和实践Android多点缩放字体的实例,对于理解Android手势检测和动态调整界面元素的大小具有很高的参考价值。开发者可以通过阅读源码,了解如何将这些概念应用于实际项目中。
这份"安卓Android源码——多点缩放字体DEMO.zip"包含了一个演示如何实现这一功能的实例。以下是对这个DEMO中涉及的关键知识点的详细解释: 1. **Android源码**:源码是应用的基础,它揭示了程序的工作原理和结构。...
本DEMO是一个专门展示如何在Android应用程序中实现多点触控缩放字体的实例。 源码分析: 1. `proguard.cfg`:这是ProGuard配置文件,用于在构建过程中优化、混淆和压缩Java代码,以减少APK的大小并提高安全性能。...
总之,Android多点触控技术是提升用户体验的重要手段,理解和熟练掌握相关API和手势检测器的使用,可以让你的Android应用更具交互性和趣味性。通过深入研究"PhotoWallFallsDemo"的代码,开发者可以更好地理解如何将...
总的来说,这个Demo涵盖了Android多点触控事件的处理和UI动态更新,对于开发者来说,这是一个很好的学习实例,可以帮助他们理解如何在实际应用中实现类似的功能。通过研究源码,开发者不仅可以掌握多点触控的基本...
总之,这个DEMO提供了一个学习Android多点缩放字体的实例,涵盖了触摸事件处理、手势识别、视图矩阵变换以及布局管理等多个核心知识点,对于进行Android UI交互设计和代码学习的开发者来说具有很高的参考价值。...
通过这个源码,开发者可以学习到Android多点触控事件处理、手势识别、动态调整UI元素属性等技术,这些对于构建更高级、交互性更强的Android应用至关重要。同时,详细注释使得源码成为初学者和进阶者学习Android开发...
在Android开发中,实现平移、缩放和旋转功能通常...总之,这个Demo为开发者提供了一个实现Android视图平移、缩放和旋转的实例,通过学习和分析这个项目,你可以掌握如何在自己的应用中实现类似的功能,提升用户体验。
提供的Demo是一个简洁的应用实例,它可能包含一个简单的Activity和布局文件,其中有一个TextView用于展示多点触控改变字体大小的效果。开发者可以通过运行这个Demo来直观地感受多点触控的功能,并根据源码学习其...
总结,这个“图片缩放Demo”主要涵盖了Android图片处理、多点触摸事件处理、自定义`ImageView`以及矩阵变换等多个核心知识点,对于需要在应用中实现图片缩放功能的开发者来说,是一个非常有价值的参考示例。