我实现的思路:

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. 使用SignalR实时Web应用程序

    实时Web应用程序能够实时地将服务器端内容推送到连接的客户端.对于ASP.NET开发人员,ASP.NET SignalR是一个向其应用程序添加实时Web功能的库.它利用了多种传输方式,根据客户端和服务 ...

  2. 关于python内存地址问题

    遇到一个朋友,给我提了一个问题:python中的两个相同的值,内存地址是否一样? 当时印象里有这样一句话:Python采用基于值的内存管理模式,相同的值在内存中只有一份 于是张嘴就说是一样的 朋友说不 ...

  3. 搭建个人博客 github+hexo

    其实相关的教程网上有很多很多,不过就是很多很多,而且技术大神们每个人都写得不一样啊喂,为什么我明明就是一步一步按照教程来的还是有那么多乱七八糟的错?...所以我决定写此篇记录一下我搭建博客的过程以及我 ...

  4. mysql select 字段别名是否可以用在 select中或者where中

    select column1+10 as c1,c1+10 as c2 from table1;想实现上面的效果,结果在mysql里面报错了,提示找不到c1这个列; -- 不同的 数据库不一样 一般不 ...

  5. Final互评------《I do》---- 二次元梦之队

    一.基于NABCD评论作品,及改进建议 1.根据(不限于)NABCD评论作品的选题; N(Need,需求):该产品是一款休闲类的解密游戏,背景是编程知识.作为一款休闲游戏,有着基本的娱乐功能,可以给用 ...

  6. Python 四种数值类型(int,long,float,complex)区别及转换

    Python支持四种不同的数值类型,包括int(整数)long(长整数)float(浮点实际值)complex (复数), 数字数据类型存储数值.他们是不可改变的数据类型,这意味着改变数字数据类型的结 ...

  7. Alpha冲刺第6天

    Alpha第六天 1.团队成员 郑西坤 031602542 (队长) 陈俊杰 031602504 陈顺兴 031602505 张胜男 031602540 廖钰萍 031602323 雷光游 03160 ...

  8. 常用的Hql语句

    // HQL: Hibernate Query Language.// 特点:// >> 1,与SQL相似,SQL中的语法基本上都可以直接使用.// >> 2,SQL查询的是表 ...

  9. poj2991 Crane(线段树)

    Description ACM has bought a new crane (crane -- jeřáb) . The crane consists of n segments of variou ...

  10. 10缓冲流、转换流、序列化流、Files

    十.流 10.1 缓冲流 10.1.1 概述                 缓冲流是对4个基本的FileXxx流的增强,所以也是4个流,按照数据类型进行分类                     ...