android中实现在ImageView上随意画线涂鸦的方法

作者:浩GE 时间:2023-03-04 07:55:23 

我实现的思路:

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来实现撤销功能。

来源:https://www.cnblogs.com/hao-dotnet/p/3269149.html

标签:android,ImageView,涂鸦
0
投稿

猜你喜欢

  • 浅谈C#设计模式之工厂模式

    2021-12-17 16:06:48
  • 详解Java中的println输入和toString方法的重写问题

    2022-12-24 05:26:33
  • SpringMVC源码解读之HandlerMapping - AbstractUrlHandlerMapping系列request分发

    2022-07-26 20:39:48
  • Java二维数组实现数字拼图效果

    2021-11-21 20:39:17
  • Android实现聊天界面

    2023-04-09 22:57:57
  • C# SMTP发送邮件的示例

    2021-06-20 12:36:10
  • java 单例的五种实现方式及其性能分析

    2023-05-10 10:50:51
  • spring mvc4中相关注解的详细讲解教程

    2021-10-11 23:21:17
  • IntelliJ IDEA使用教程从入门到上瘾(2019图文版)

    2023-03-30 17:00:49
  • C#验证控件validator的简单使用

    2023-04-26 06:05:31
  • C#中lock用法详解

    2021-06-07 23:24:05
  • Android实现调用摄像头拍照与视频功能

    2021-11-22 08:02:28
  • C#程序员统计自己的代码行数

    2021-10-18 05:37:37
  • Android Studio 报错failed to create jvm error code -4的解决方法

    2023-01-22 03:13:49
  • C++实现企业职工工资管理系统

    2023-11-02 17:34:34
  • Android studio 混淆配置详解

    2023-02-16 19:17:22
  • Java实现设计模式之责任链模式

    2023-12-09 21:02:12
  • Android自定义组件获取本地图片和相机拍照图片

    2022-07-09 21:54:48
  • Android支付宝和微信支付集成

    2023-11-30 17:38:56
  • java基础教程之拼图游戏的实现

    2022-05-02 21:22:21
  • asp之家 软件编程 m.aspxhome.com