我实现的思路:

1.继承ImageView类

2.重写onTouchEvent方法,在ACTION_MOVE(即移动时),记录下所经过的点坐标,在ACTION_UP时(即手指离开时,这时一条线已经画完),将所画的线(点的集合)保存在一个集合中

3.重写onDraw方法,利用canvas和所记录下的线和点画出线来

可能我讲的十分笼统,下面来看看实际的代码吧

//代表ImageView上的一点
public class ViewPoint
{
  float x;
  float y;
} //表示一条线
public class Line
{
  ArrayList<ViewPoint> points = new ArrayList<ViewPoint>();
}

如上所示,ViewPoint表示一点,而Line表示一条线

然后在扩展的ImageView类上声明如下:

public class HandWritingImageView extends ImageView
{
  private Paint paint;   //当前正在画的线
  private Line current = new Line();
//所有画过的线
  private ArrayList<Line> lines = new ArrayList<Line>();
}

随后重写onTouchEvent方法

    @Override
public boolean onTouchEvent(MotionEvent event)
{
//获取坐标
clickX = event.getX();
clickY = event.getY(); if (event.getAction() == MotionEvent.ACTION_DOWN)
{
invalidate(); return true;
}
else if (event.getAction() == MotionEvent.ACTION_MOVE)
{
ViewPoint point = new ViewPoint();
point.x = clickX;
point.y = clickY;
//在移动时添加所经过的点
current.points.add(point); invalidate();
return true;
}
else if (event.getAction() == MotionEvent.ACTION_UP)
{
//添加画过的线
lines.add(current);
current = new Line(); invalidate();
} return super.onTouchEvent(event);
}

可以看到当我们手指移动时,获取保存所经过的点并调用invalidate方法进行屏幕刷新(可以使onDraw方法被调用,稍后可以看到),当我们手指离开时添加之前的所画的线到集合中,并调用invalidate方法

接下来看看所重写的onDraw方法,它利用所保存的线的信息进行画线

    @Override
protected void onDraw(Canvas canvas)
{
super.onDraw(canvas);
//画出之前所有的线
for (int i = 0; i < lineData.lines.size(); i++)
{
drawLine(canvas, lines.get(i));
} //画出当前的线
drawLine(canvas, current); } private void drawLine(Canvas canvas, Line line)
{
for (int i = 0; i < line.points.size() - 1; i++)
{
float x = line.points.get(i).x;
float y = line.points.get(i).y; float nextX = line.points.get(i + 1).x;
float nextY = line.points.get(i + 1).y; canvas.drawLine(x, y, nextX, nextY, paint);
}
}

这样就可以在ImageView上随意涂鸦了,并且还可以通过删除lines中的最后条line来实现撤销功能。

本人接触android才3周,有很多不清楚的地方,还请赐教

 

android中实现在ImageView上随意画线涂鸦的更多相关文章

  1. Android中如何查看内存(上)

    文章参照自:http://stackoverflow.com/questions/2298208/how-to-discover-memory-usage-of-my-application-in-a ...

  2. Android中自定义ListView实现上拉加载更多和下拉刷新

    ListView是Android中一个功能强大而且很常用的控件,在很多App中都有ListView的下拉刷新数据和上拉加载更多这个功能.这里我就简单记录一下实现过程. 实现这个功能的方法不止一个,Gi ...

  3. IOS开发中--点击imageView上的Button没有任何反应

    点击imageView上的Button没有任何反应:    解决方法:设置图片的userInteractionEnabled为YES,使该imageView可以与用户进行交互

  4. android中动态修改ImageView控件的宽高度

    本例实现了动态修改ImageView控件的宽高度,有两个按钮,一个按钮实现放大image,一个按钮实现缩小image activity_main.xml <?xml version=" ...

  5. Android中的Parcel机制(上)

    一.先从Serialize说起 我们都知道JAVA中的Serialize机制,译成串行化.序列化--,其作用是能将数据对象存入字节流当中,在需要时重新生成对象.主要应用是利用外部存储设备保存对象状态, ...

  6. H5中画图标签Canvas---画矩形,画线,画圆,渐变色,图形载入

    一: 1.鼠标监视坐标值 <!DOCTYPE html> <head> <meta charset=UTF-8> <title>canvas的演示< ...

  7. ANDROID中去掉ACTIONBAR或TABWIDGET的分隔线

    在android中,有时需要对ActionBar或者TabWidget的分隔线进行定制,如取消,相关的属性设置为android:divider 以TabWidget为例,取消对应的函数: tabWid ...

  8. Android开发经验之在图片上随意点击移动文字

    只要在图片范围之内,文字可随意点击移动. package xiaosi.GetTextImage; import android.content.Context; import android.con ...

  9. Android中 在显示ImageView时图片上面和下面都出现一段空白区间的解决办法

    开始的时候是在ScrollView中显示ImageView的时候出现这样的问题,以为是要对ScrollView进行设置的,后来发现单独显示一个ImageView的时候也会出现这样的问题,由此才知道是应 ...

随机推荐

  1. Centos 7 安装mysql5.7.24二进制 版本

    Mysql 二进制安装方法 下载mysql https://dev.mysql.com/downloads/mysql/ 1.解压包 tar xf mysql-5.7.24-linux-glibc2. ...

  2. Ps矩形工具的运用

    矩形工具 1.标识位置以及快捷键 位于左侧工具栏中,快键键是u,根据需求选择里面包含的工具 2.使用方法 鼠标左键点击工具,直接在图层使用,点击后拖住不放选择想要的图形后松手即可. 可以根据自身的需求 ...

  3. Python_汇总生成统计报表

    import xlrd import xlwt from xlutils.copy import copy objWb = xlrd.open_workbook(r'C:\Users\IBM\Desk ...

  4. 前端开发工具icestar

    前端开发工具icestar 最近忙里偷闲,把之前的mock工具进行了全面的重构,最大的改变就是换了个名称icestar,icestar意思就是"爱死他",首先他的预想并不只是替代m ...

  5. 阿里云容器服务区块链解决方案全新升级 支持Hyperledger Fabric v1.1

    摘要: 全球开源区块链领域影响最为广泛的Hyperledger Fabric日前宣布了1.1版本的正式发布,带来了一系列丰富的新功能以及在安全性.性能与扩展性等方面的显著提升.阿里云容器服务区块链解决 ...

  6. Algorithms学习笔记-Chapter0序言

    0.开篇 <Algorithms>源自Berkeley和UCSD课程讲义,由   Sanjoy Dasgupta / Christos H. Papadimitriou / Umesh V ...

  7. 1084. Broken Keyboard (20)-水题

    #include <iostream> #include <cstdio> #include <string.h> #include <algorithm&g ...

  8. 《Linux内核分析》第三周:Linux系统启动过程

    杨舒雯 原创作品转载请注明出处 Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.实验--使用gdb跟踪调试内 ...

  9. Linux内核分析第四周总结

    用户态,内核态和中断处理过程 库函数将系统调用封装起来 用户态和内核态的差别: 在内核态时,cs和eip的值可以是任意地址,但在用户态时只能访问0x00000000 - 0xbfffffff,0x00 ...

  10. linux 常用命令-ps(process state)

    ps -ef | grep 端口号:查看某个端口的占用情况 ps -tunlp | grep 端口号:查看占用端口的进程名称