最近做了一个功能和两年前一样的功能,我想说的是我还真不会写了。又在网上进行了搜索找到了。今天记录下来,下次在遇到就不用四处搜索了。
这里我提供两个方法去做这个功能。
1,自定义view
准备画布和画笔 上代码
paint = new Paint();
paint.setColor(Color.BLUE);
paint.setStyle(Paint.Style.STROKE);
paint.setStrokeWidth(10);
//bitmap
bitmap = Bitmap.createBitmap(width3, height3, Bitmap.Config.ARGB_8888);
//创建画布
canvas = new Canvas(bitmap);
//imageView 设置bitmap
gestureOverlayView.setImageBitmap(bitmap);
imaggview设置触摸事件
gestureOverlayView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
point = new Point((int) event.getX(), (int) event.getY());
// 绘制触摸轨迹,同时存储轨迹
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
downX = event.getX();
downY = event.getY();
list.add(point);
break;
case MotionEvent.ACTION_MOVE:
upX = event.getX();
upY = event.getY();
canvas.drawLine(downX, downY, upX, upY, paint);
gestureOverlayView.invalidate();
downX = upX;
downY = upY;
list.add(point);
break;
case MotionEvent.ACTION_UP:
list.add(point);
// 线段绘制结束时,创建一个临时的list,转存这条线段(不要直接=)
List<Point> list_temp = new ArrayList<Point>(list);
linesList.add(list_temp);
// 存储完一条线段后,清空list对象
pointString = gson.toJson(linesList);
list.clear();
break;
case MotionEvent.ACTION_CANCEL:
break;
}
return true;
}
});
这里有一个很大坑,就是需要将绘制的线段保存到一个临时的list中,在将list保存到大的集合中。如果不这样会出现保存的绘制线段只是最后的一段。
还需要注意的就是利用Gosn对线的集合转为String,(方便保存信息) 再次用的时候就只需吧String 转回线的集合就可以了
回放
List<List<Point>> newPoint = new ArrayList<>();
newPoint = gson.fromJson(one,new TypeToken<List<List<Point>>>(){}.getType());
if (newPoint.size() > 0) {
for (int i = 0; i < newPoint.size(); i++) {
if (newPoint.get(i).size() > 0) {
if (newPoint.get(i).size() > 1) {
for (int j = 0; j < newPoint.get(i).size(); j++) {
if (j == newPoint.get(i).size() - 1) {
continue;
}
canvas.drawLine(newPoint.get(i).get(j).x, newPoint.get(i).get(j).y, newPoint.get(i).get(j + 1).x, newPoint.get(i).get(j + 1).y, paint);
gestureOverlayView.invalidate();
}
}
}
}
}
2 ,第二种就是通过
GestureOverlayView
手势的方式进行point的保存
mDrawGestureView.addOnGestureListener(new OnGestureListener() {
@Override
public void onGestureStarted(GestureOverlayView overlay,
MotionEvent event) {
mGesture = null;
if (list.size() > 0)
list.clear();
float x = event.getX();
float y = event.getY();
point = new Point((int)x,(int)y);
list.add(point);
}
@Override
public void onGesture(GestureOverlayView overlay, MotionEvent event) {
float x = event.getX();
float y = event.getY();
point = new Point((int)x,(int)y);
list.add(point);
}
@Override
public void onGestureEnded(GestureOverlayView overlay,
MotionEvent event) {
mGesture = overlay.getGesture();
if (mGesture != null) {
// mButton1.setEnabled(true);
}
float x = event.getX();
float y = event.getY();
point = new Point((int)x,(int)y);
list.add(point);
List<Point> kk = new ArrayList<>(list);
listPoint.add(kk);
one = gson.toJson(listPoint);
Log.d("dada", "onGestureEnded: "+listPoint.size());
}
@Override
public void onGestureCancelled(GestureOverlayView overlay,
MotionEvent event) {
}
});
GestureOverlayView有三个callback 对点进行保存即可。回放的方式和第一种一样。