我正在尝试制作一个基本的像素绘图应用程序,该应用程序将绘图组件拆分为10x10的网格,并使用路径填充了拖动的路径通过时填充的网格元素。我是应用程序设计的新手,目前正在尝试通过在每次调用TouchEvent时更新位图并填充触摸位置周围的10%x和10%y区域来实现此目的,但这似乎不起作用。如果不使用drawPath,就无法使用路径作为此类程序的输入来找到任何东西,这不是我想要的!任何帮助将不胜感激。我已经为我的paintView文件添加了代码。
谢谢!
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BlurMaskFilter;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.EmbossMaskFilter;
import android.graphics.MaskFilter;
import android.graphics.Paint;
import android.graphics.Path;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.view.MotionEvent;
import android.view.View;
import java.util.ArrayList;
public class PaintView extends View {
public static int BRUSH_SIZE = 20;
public static final int DEFAULT_COLOR = Color.RED;
public static final int DEFAULT_BG_COLOR = Color.WHITE;
private static final float TOUCH_TOLERANCE = 4;
private float mX, mY;
private Path mPath;
private Paint mPaint;
private ArrayList<FingerPath> paths = new ArrayList<>();
private int currentColor;
private int backgroundColor = DEFAULT_BG_COLOR;
private int strokeWidth;
public Bitmap mBitmap;
private Canvas mCanvas;
private Paint mBitmapPaint = new Paint(Paint.DITHER_FLAG);
public PaintView(Context context) {
this(context, null);
}
public PaintView(Context context, AttributeSet attrs) {
super(context, attrs);
mPaint = new Paint();
mPaint.setAntiAlias(true);
mPaint.setDither(true);
mPaint.setColor(DEFAULT_COLOR);
mPaint.setStyle(Paint.Style.STROKE);
mPaint.setStrokeJoin(Paint.Join.ROUND);
mPaint.setStrokeCap(Paint.Cap.ROUND);
mPaint.setXfermode(null);
mPaint.setAlpha(0xff);
}
public void init(DisplayMetrics metrics) {
int height = metrics.heightPixels;
int width = metrics.widthPixels;
mBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
mCanvas = new Canvas(mBitmap);
currentColor = DEFAULT_COLOR;
strokeWidth = BRUSH_SIZE;
}
public void clear() {
backgroundColor = DEFAULT_BG_COLOR;
paths.clear();
invalidate();
}
private Bitmap pixelate(float xc, float yc, Bitmap bitmap){
int height = bitmap.getHeight();
int width = bitmap.getWidth();
float decx = xc/(width/10);
int xs = (int)(0.1*decx)*width;
float decy = yc/(height/10);
int ys = (int)(0.1*decy)*height;
Bitmap bmOut = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
for(int x = xs; x < xs + 0.1*width;x++){
if (x < width) {
for (int y = ys; y < ys + 0.1*width; y++) {
if (y < height) {
bmOut.setPixel(x, y, Color.argb(255, 255, 0, 0));
}
}
}
}
return bmOut;
}
@Override
protected void onDraw(Canvas canvas) {
canvas.save();
mCanvas.drawColor(backgroundColor);
for (FingerPath fp : paths) {
mPaint.setColor(fp.color);
mPaint.setStrokeWidth(fp.strokeWidth);
mPaint.setMaskFilter(null);
mCanvas.drawPath(fp.path, mPaint);
}
canvas.drawBitmap(mBitmap, 0, 0, mBitmapPaint);
canvas.restore();
}
private void touchStart(float x, float y) {
mPath = new Path();
FingerPath fp = new FingerPath(currentColor, strokeWidth, mPath);
paths.add(fp);
mPath.reset();
mPath.moveTo(x, y);
mX = x;
mY = y;
}
private void touchMove(float x, float y) {
float dx = Math.abs(x - mX);
float dy = Math.abs(y - mY);
if (dx >= TOUCH_TOLERANCE || dy >= TOUCH_TOLERANCE) {
mPath.quadTo(mX, mY, (x + mX) / 2, (y + mY) / 2);
mX = x;
mY = y;
}
}
private void touchUp() {
mPath.lineTo(mX, mY);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
float x = event.getX();
float y = event.getY();
switch(event.getAction()) {
case MotionEvent.ACTION_DOWN :
touchStart(x, y);
mBitmap = pixelate(x, y, mBitmap);
invalidate();
break;
case MotionEvent.ACTION_MOVE :
touchMove(x, y);
mBitmap = pixelate(x,y,mBitmap);
invalidate();
break;
case MotionEvent.ACTION_UP :
touchUp();
mBitmap = pixelate(x,y,mBitmap);
invalidate();
break;
}
return true;
}
}