主要思路就是在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-05-16 10:30:01 发布