自定义 View:多点触摸画笔的实现
作者:Changing Lin
- 2021 年 11 月 17 日
本文字数:1196 字
阅读完需:约 4 分钟
1.知识点
View.onTouchEvent 方法中的 MotionEvent 参数的事件类型对比
Paint.setStrokeCap 方法是什么意思
Paint.setStrokeJoin 方法是什么意思
2.原理
未完待续,此处会有一个表格,对比各个 ActionMasked 的差异
3.代码
package com.besmart.components;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Path;
import android.util.AttributeSet;
import android.util.SparseArray;
import android.view.MotionEvent;
import android.view.View;
import androidx.annotation.Nullable;
public class TestView extends View {
Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
SparseArray<Path> paths = new SparseArray<>();
public TestView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
}
{
paint.setStyle(Paint.Style.STROKE);
paint.setStrokeWidth(Util.dp2px(4));
paint.setStrokeCap(Paint.Cap.ROUND);
paint.setStrokeJoin(Paint.Join.ROUND);
}
@Override
protected void onDraw(Canvas canvas) {
for (int i = 0; i < paths.size(); i++) {
Path path = paths.valueAt(i);
canvas.drawPath(path, paint);
}
}
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getActionMasked()){
case MotionEvent.ACTION_DOWN:
case MotionEvent.ACTION_POINTER_DOWN:
int actionIndex = event.getActionIndex();
int pointerId = event.getPointerId(actionIndex);
Path path = new Path();
path.reset();
path.moveTo(event.getX(actionIndex), event.getY(actionIndex));
paths.append(pointerId, path);
break;
case MotionEvent.ACTION_MOVE:
for (int i = 0; i < event.getPointerCount(); i++) {
pointerId = event.getPointerId(i);
path = paths.get(pointerId);
path.lineTo(event.getX(i), event.getY(i));
}
invalidate();
break;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_POINTER_UP:
actionIndex = event.getActionIndex();
pointerId = event.getPointerId(actionIndex);
paths.remove(pointerId);
invalidate();
break;
}
return true;
}
}
复制代码
划线
评论
复制
发布于: 2 小时前阅读数: 4
版权声明: 本文为 InfoQ 作者【Changing Lin】的原创文章。
原文链接:【http://xie.infoq.cn/article/a3ea54b45d04545ff6dcb34f9】。文章转载请联系作者。
Changing Lin
关注
获得机遇的手段远超于固有常规之上~ 2020.04.29 加入
我能做的,就是调整好自己的精神状态,以最佳的面貌去面对那些未曾经历过得事情,对生活充满热情和希望。
评论