主要思路就是在onTouchEvent处理move路径
落笔的地方就用mPath.moveTo(event.getX(),event.getY());
滑动就用mPath.quadTo(mPreX,mPreY,endX,endY);
我这里认为在up的时候就是一笔花完了,drawUp方法是自己处理逻辑用的。
switch (event.getAction()){
case MotionEvent.ACTION_DOWN:
curDate = new Date(System.currentTimeMillis()); mPath.moveTo(event.getX(),event.getY()); mPreX = event.getX(); mPreY = event.getY(); lists.add(new xyBean(mPreX,mPreY,true)); Log.e("111",mPreX+":"+mPreY); return true; case
MotionEvent.ACTION_MOVE:
float endX = (mPreX+event.getX())/2;
float endY = (mPreY+event.getY())/2;
Log.e("111",endX+":"+endY);
mPath.quadTo(mPreX,mPreY,endX,endY);
mPreX = event.getX();
mPreY = event.getY();
lists.add(new xyBean(mPreX,mPreY,false));
invalidate();
break;
case MotionEvent.ACTION_UP:
endDate = new Date(System.currentTimeMillis());
long time = endDate.getTime()-curDate.getTime(); drawUp.drawUp(lists.size(),getContractSignMessage(),time);
lists.clear();
break; }
public class MyDrawView extends View {
private Path mPath = new Path();
Paint paint = new Paint();
private float mPreX,mPreY;
private List<xyBean> lists = new ArrayList<>();
private drawUp drawUp;
private Date curDate,endDate;
public MyDrawView(Context context,drawUp drawUp) {
super(context);
this.drawUp = drawUp;
}
public MyDrawView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
paint.setStyle(Paint.Style.STROKE);
paint.setColor(Color.BLACK);
paint.setStrokeWidth(15);
canvas.drawPath(mPath,paint);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int width = MeasureSpec.getSize(widthMeasureSpec);
int hedight = MeasureSpec.getSize(heightMeasureSpec);
Log.e("11111111",width+":"+hedight);
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()){
case MotionEvent.ACTION_DOWN:
curDate = new Date(System.currentTimeMillis());
mPath.moveTo(event.getX(),event.getY());
mPreX = event.getX();
mPreY = event.getY();
lists.add(new xyBean(mPreX,mPreY,true));
Log.e("111",mPreX+":"+mPreY);
return true;
case MotionEvent.ACTION_MOVE:
float endX = (mPreX+event.getX())/2;
float endY = (mPreY+event.getY())/2;
Log.e("111",endX+":"+endY);
mPath.quadTo(mPreX,mPreY,endX,endY);
mPreX = event.getX();
mPreY = event.getY();
lists.add(new xyBean(mPreX,mPreY,false));
invalidate();
break;
case MotionEvent.ACTION_UP:
endDate = new Date(System.currentTimeMillis());
long time = endDate.getTime()-curDate.getTime();
drawUp.drawUp(lists.size(),getContractSignMessage(),time);
lists.clear();
break;
}
return super.onTouchEvent(event);
}
//清空方法
public void reset(){
if(countDownTimer!=null){
countDownTimer.cancel();
countDownTimer = null;
}
lists.clear();
mPath.reset();
postInvalidate();
}
private CountDownTimer countDownTimer;
int i = 0;
float startX,startY,endX,endY;
//查看绘制效果
public void drawName(){
try {
if(countDownTimer!=null){
countDownTimer.cancel();
countDownTimer = null;
}
int numI = lists.size();
countDownTimer = new CountDownTimer(numI*50,50) {
@Override
public void onTick(long millisUntilFinished) {
xyBean xyBean = lists.get(i);
boolean down = xyBean.isDown();
if(down){
float x = xyBean.getX();
float y = xyBean.getY();
mPath.moveTo(x,y);
startX = x;
startY = y;
}else {
float x = xyBean.getX();
float y = xyBean.getY();
endX = (startX+x)/2;
endY = (startY+y)/2;
mPath.quadTo(startX,startY,endX,endY);
startX = x;
startY = y;
}
invalidate();
if(i<lists.size()-1){
i++;
}
}
@Override
public void onFinish() {
lists.clear();
i = 0;
}
};
countDownTimer.start();
}catch (Exception e){
}
}
public String getContractSignMessage(){
String json = GsonUtils.toJson(lists);
return json;
}
public interface drawUp{
void drawUp(int size,String json,long time);
}
public List<xyBean> getLists(){
return lists;
}
private class xyBean{
private float x;
private float y;
private boolean down;
public xyBean(float x, float y,boolean down) {
this.x = x;
this.y = y;
this.down = down;
}
public float getX() {
return x;
}
public void setX(float x) {
this.x = x;
}
public float getY() {
return y;
}
public void setY(float y) {
this.y = y;
}
public boolean isDown() {
return down;
}
public void setDown(boolean down) {
this.down = down;
}
}
}
自定义签名View以及绘制
最新推荐文章于 2025-11-24 15:06:53 发布

393

被折叠的 条评论
为什么被折叠?



