欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

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

程序员文章站 2024-03-07 17:12:39
本文实例讲述了android编程开发之多点触摸(multitouch)实现方法。分享给大家供大家参考,具体如下: 如果您对开发多点触摸程序感兴趣的话,那么本文将是一个很好...

本文实例讲述了android编程开发之多点触摸(multitouch)实现方法。分享给大家供大家参考,具体如下:

如果您对开发多点触摸程序感兴趣的话,那么本文将是一个很好的开始,android应用程序开发中,多点触摸不是那么遥不可及,实现起来也很简单,本例只需要两个类就能实现多点触摸。

首先来看看我们的视图类mtview.java:

package com.ideasandroid.demo;
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.surfaceview;
public class mtview extends surfaceview implements surfaceholder.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 mtview(context context) {
    super(context);
    surfaceholder holder = getholder();
    holder.addcallback(this);
    setfocusable(true); // 确保我们的view能获得输入焦点
    setfocusableintouchmode(true); // 确保能接收到触屏事件
    init();
  }
  private 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,开始进行相应的界面处理
    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);
        }
      }
      // 画完后,unlock
      getholder().unlockcanvasandpost(c);
    }
    return true;
  }
  /**
   * 画十字及坐标信息
   *
   * @param x
   * @param y
   * @param paint
   * @param ptr
   * @param id
   * @param c
   */
  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);
  }
  /**
   * 画圆
   *
   * @param x
   * @param y
   * @param paint
   * @param c
   */
  private void drawcircle(int x, int y, paint paint, canvas c) {
    c.drawcircle(x, y, 40 * scale, paint);
  }
  /*
   * 进入程序时背景画成黑色,然后把“start_text”写到屏幕
   */
  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);
    }
  }
  public void surfacecreated(surfaceholder holder) {
  }
  public void surfacedestroyed(surfaceholder holder) {
  }
}

代码中都做了相应的注释,这里就不多说。

接下来看看我们的activity,multitouchvisible.java

package com.ideasandroid.demo;
import android.app.activity;
import android.os.bundle;
import android.view.window;
import android.view.windowmanager;
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);
    //设置为上面的mtview
    setcontentview(new mtview(this));
  }
}

更多关于android相关内容感兴趣的读者可查看本站专题:《android开发入门与进阶教程》、《android编程之activity操作技巧总结》、《android视图view技巧总结》、《android操作sqlite数据库技巧总结》、《android操作json格式数据技巧总结》、《android数据库操作技巧总结》、《android文件操作技巧汇总》、《android编程开发之sd卡操作方法汇总》、《android资源操作技巧汇总》及《android控件用法总结

希望本文所述对大家android程序设计有所帮助。