Developer技术博客 DevEngineer:林建有

涂鸦功能

2020-03-10
林建有

涂鸦功能介绍

创建图形

由各个事项定义好的图形对象实现draw方法来画出对应图形。

如下圆形对象的定义:


	public class Circle extends ShapeAbstract {
	
	public Circle(Shapable paintTool) {
		super(paintTool);
	}
	
	@Override
	public void draw(Canvas canvas, Paint paint) {
		if (canvas==null || paint == null) {
			return;
		}
		super.draw(canvas, paint);
		float cx = (x1 + x2)/2;
		float cy = (y1+y2)/2;
		float radius = (float) Math.sqrt(Math.pow(x1 - x2, 2)
				+ Math.pow(y1 - y2, 2))/2;
		canvas.drawCircle(cx, cy, radius, paint);
	}
	
	@Override
	public String toString() {
		return " circle";
	}
}

其中x1,x2,x2,y2的含义是手势触摸移动的坐标

x1 = firstCurrentPos.firstX;
y1 = firstCurrentPos.firstY;
x2 = firstCurrentPos.currentX;
y2 = firstCurrentPos.currentY;

其他图示类似方法来定义。

五角星需要数学知识计算如何画图形。

通过Canvas对象来画对应的形状:

canvas.drawLine(float startX, float startY, float stopX, float stopY,@NonNull Paint paint) ;//画直线
canvas.drawPath(@NonNull Path path, @NonNull Paint paint) ;//画路径曲线,五角星
canvas.drawOval(@NonNull RectF oval, @NonNull Paint paint);//画椭圆
canvas.drawRect(float left, float top, float right, float bottom, @NonNull Paint paint);//画矩形或正方形

画笔类型

画笔类型分为:

  • 普通
  • 模糊
  • 浮雕
  • 橡皮擦

画笔实现方式

画笔对象:android.graphics.Paint

普通画笔

PlainPen:设置Paint.Style.STROKE

模糊

BlurPen: 设置Paint.Style.STROKE,设置maskFilter

// BlurMaskFilter 指定了一个模糊的样式和半径来处理Paint的边缘。
mBlur = new BlurMaskFilter(8, BlurMaskFilter.Blur.NORMAL);
mPenPaint.setMaskFilter(mBlur);

浮雕

EmbossPen :设置Paint.Style.STROKE,设置maskFilter

// EmbossMaskFilter 指定了光源的方向和环境光强度来添加浮雕效果。
mEmboss = new EmbossMaskFilter(new float[] {
        1, 1, 1
}, 0.4f, 6, 3.5f);
mPenPaint.setMaskFilter(mEmboss);

橡皮擦

Eraser:设置PorterDuffXfermode为PorterDuff.Mode.DST_OUT

mEraserPaint
      .setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_OUT));

结合手势move坐标创建Path然后画贝塞尔曲线

// 画出贝塞尔曲线
private void drawBeziercurve(float x, float y) {
   mPath.quadTo(mCurrentX, mCurrentY, (x + mCurrentX) / 2,
         (y + mCurrentY) / 2);
}

之后画橡皮曲线

@Override
public void draw(Canvas canvas) {
   if (null != canvas) {
      canvas.drawPath(mPath, mEraserPaint);
   }
}

代码位置

package com.xvideostudio.videoeditor.paintpadinterfaces
package com.xvideostudio.videoeditor.paintshapes
package com.xvideostudio.videoeditor.painttools
package com.xvideostudio.videoeditor.paintutils
package com.xvideostudio.videoeditor.paintviews

Comments

Content