我实现的思路:

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. HTML 脚本 (Script) 实例

    1.JavaScript 使 HTML 页面具有更强的动态和交互性.HTML script 元素<script> 标签用于定义客户端脚本,比如 JavaScript. script 元素既 ...

  2. CentOS7使用winbind加入AD

    https://ishm.idv.tw/?p=336 CentOS 7 使用 winbind 加入 AD 需求:已經熟悉 CentOS 6 的 AD 加入方式,CentOS 7 已將 winbind ...

  3. Shell 基础 -- 输入、输出重定向

    一.文件描述符 文件描述符是一个非负的整数,Linux 中每个运行中的程序(进程),都有一些与之关联的文件描述符,你可以使用文件描述符来访问打开的文件或设备.在标准 I/O 库中,与文件描述符对应的是 ...

  4. 1090. Highest Price in Supply Chain (25)-dfs求层数

    给出一棵树,在树根出货物的价格为p,然后每往下一层,价格增加r%,求所有叶子节点中的最高价格,以及该层叶子结点个数. #include <iostream> #include <cs ...

  5. 《Linux内核分析》第一周学习小结 计算机是如何工作的?

    <Linux内核分析>第一周.计算机是如何工作的? 20135204 郝智宇  一.存储程序计算机工作模型 1.      冯诺依曼体系结构: 数字计算机的数制采用二进制:计算机应该按照程 ...

  6. 20135316王剑桥Linux内核学习笔记

    王剑桥Linux内核学习笔记 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 计算机是如何工作的 个人理 ...

  7. 20170929php

    这是之前学习PHP类使用的代码 <?phpclass animal{ var $name="1"; var $sex="2"; public static ...

  8. 转发npm发布包的过程

    老板,来个npm账号! 因为你的包是要放在npm上的,所以,没有npm的账号,根本什么活都干不了. 在npm上注册一个账号是很简单的,随便填一下用户名密码邮箱,然后人家就会发个邮件给你,然后就注册成功 ...

  9. (第三周)c#程序理解

    阅读下面程序,请回答如下问题: 问题1:这个程序要找的是符合什么条件的数? 问题2:这样的数存在么?符合这一条件的最小的数是什么? 问题3:在电脑上运行这一程序,你估计多长时间才能输出第一个结果?时间 ...

  10. Alpha冲刺——day4

    Alpha冲刺--day4 作业链接 Alpha冲刺随笔集 github地址 团队成员 031602636 许舒玲(队长) 031602237 吴杰婷 031602220 雷博浩 031602634 ...