当前位置: 移动技术网 > 移动技术>移动开发>Android > Android编程开发之多点触摸(Multitouch)实现方法

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

2019年07月24日  | 移动技术网移动技术  | 我要评论

本文实例讲述了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程序设计有所帮助。

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网