android画布橡皮,android

我正在创建一个利用下面的DrawingSurfaceView类的绘图应用程序。 在那个类中,我有一个Paint Called橡皮图画,用户可以打开和关闭..当在那个画面上假设橡皮擦的路径是什么。 但它只是画了一条黑线..

当我将画布保存为透明png时,橡皮擦是正确的,但在屏幕上显示黑色..

用于在blob上写“Erik”的EraserPaint手机屏幕截图

aHR0cHM6Ly9pLnN0YWNrLmltZ3VyLmNvbS9aM1NsRi5wbmc=

从画布中保存了PNG

c10a8ca22075c2c91c96fc12f8de6f35.png

eraserPaint看起来像这样:

eraserPaint = new Paint();

eraserPaint.setAlpha(0);

eraserPaint.setColor(Color.TRANSPARENT);

eraserPaint.setStrokeWidth(60);

eraserPaint.setStyle(Style.STROKE);

eraserPaint.setMaskFilter(null);

eraserPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));

eraserPaint.setAntiAlias(true);

整个班级

public KNDrawingSurfaceView(Context c, float width, float height, KNSketchBookActivity parent) {

super(c);

myWidth = width;

myHeight = height;

mBitmap = Bitmap.createBitmap((int) myWidth, (int) myHeight, Bitmap.Config.ARGB_8888);

mCanvas = new Canvas(mBitmap);

_parent = parent;

mEmboss = new EmbossMaskFilter(new float[] { 1, 1, 1 }, 0.4f, 6, 3.5f);

tile = new Paint();

tileImage = BitmapFactory.decodeResource(getResources(), R.drawable.checkerpattern);

shader = new BitmapShader(tileImage, Shader.TileMode.REPEAT, Shader.TileMode.REPEAT);

tile.setShader(shader);

mPath = new Path();

eraserPaint = new Paint();

eraserPaint.setAlpha(0x00);

eraserPaint.setColor(Color.TRANSPARENT);

eraserPaint.setStrokeWidth(60);

eraserPaint.setStyle(Style.STROKE);

//eraserPaint.setMaskFilter(null);

eraserPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));

eraserPaint.setAntiAlias(true);

mBitmapPaint = new Paint(Paint.DITHER_FLAG);

mCanvas.drawRect(0, 0, myWidth, myHeight, tile);

mCanvas.drawBitmap(mBitmap, 0, 0, mBitmapPaint);

mCanvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR);

}

@Override

protected void onSizeChanged(int w, int h, int oldw, int oldh) {

super.onSizeChanged(w, h, oldw, oldh);

}

@Override

protected void onDraw(Canvas canvas) {

if (!_parent.isDrawerOpen()&&mPaint!=null) {

Log.v("onDraw:", "curent paths size:" + paths.size());

//mCanvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR);

//canvas.drawPath(mPath, mPaint);

for (int i=0;i< paths.size();i++) {

tempPaint = paints.get(i);

eraserPaint.setStrokeWidth(tempPaint.getStrokeWidth());

if(fills.get(i)){

tempPaint.setStyle(Style.FILL_AND_STROKE);

eraserPaint.setStyle(Style.FILL_AND_STROKE);

}else{

tempPaint.setStyle(Style.STROKE);

eraserPaint.setStyle(Style.STROKE);

}

if(erasers.get(i)){

//tempPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));

canvas.drawPath(paths.get(i), eraserPaint);

}else{

//tempPaint.setXfermode(null);

canvas.drawPath(paths.get(i), tempPaint);

}

//canvas.drawPath(paths.get(i), tempPaint);

}

if(_parent.toggleFill.isChecked()){

mPaint.setStyle(Style.FILL_AND_STROKE);

eraserPaint.setStyle(Style.FILL_AND_STROKE);

}else{

mPaint.setStyle(Style.STROKE);

eraserPaint.setStyle(Style.STROKE);

}

if(_parent.toggleErase.isChecked()){

//mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));

canvas.drawPath(mPath, eraserPaint);

}else{

//mPaint.setXfermode(null);

canvas.drawPath(mPath, mPaint);

}

//canvas.drawPath(mPath, mPaint);

}

}

public void onClickUndo() {

if (paths.size() > 0) {

undonePaths.add(paths.remove(paths.size() - 1));

undonePaints.add(paints.remove(paints.size() - 1));

undoneFills.add(fills.remove(fills.size() - 1));

undoneErasers.add(erasers.remove(erasers.size() - 1));

clearCanvasCache();

invalidate();

} else {

}

_parent.checkButtonStates();

}

public void onClickRedo() {

if (undonePaths.size() > 0) {

paths.add(undonePaths.remove(undonePaths.size() - 1));

paints.add(undonePaints.remove(undonePaints.size() - 1));

fills.add(undoneFills.remove(undoneFills.size() - 1));

erasers.add(undoneErasers.remove(undoneErasers.size() - 1));

clearCanvasCache();

invalidate();

} else {

}

_parent.checkButtonStates();

}

public void onClickClear() {

paths.clear();

paints.clear();

fills.clear();

erasers.clear();

undoneFills.clear();

undonePaths.clear();

undonePaints.clear();

undoneErasers.clear();

clearCanvasCache();

invalidate();

_parent.checkButtonStates();

}

public void saveDrawing() {

FileOutputStream outStream = null;

String fileName = "tempTag";

try {

outStream = new FileOutputStream("/sdcard/" + fileName + ".png");

mBitmap.compress(Bitmap.CompressFormat.PNG, 100, outStream);

outStream.close();

} catch (FileNotFoundException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

} finally {

}

}

private float mX, mY;

private static final float TOUCH_TOLERANCE = 4;

private void touch_start(float x, float y) {

undonePaths.clear();

undonePaints.clear();

undoneFills.clear();

mPath.reset();

mPath.moveTo(x, y);

mX = x;

mY = y;

}

private void touch_move(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 touch_up() {

mPath.lineTo(mX, mY);

// commit the path to our offscreen

if(_parent.toggleErase.isChecked()){

mCanvas.drawPath(mPath, eraserPaint);

erasers.add(true);

paints.add(eraserPaint);

}else{

mCanvas.drawPath(mPath, mPaint);

erasers.add(false);

paints.add(mPaint);

}

// kill this so we don't double draw

paths.add(mPath);

if(_parent.toggleFill.isChecked()){

fills.add(true);

}else{

fills.add(false);

}

if(_parent.toggleErase.isChecked()){

erasers.add(true);

}else{

erasers.add(false);

}

_parent.checkButtonStates();

mPath = new Path();

}

@Override

public boolean onTouchEvent(MotionEvent event) {

if(mPaint==null &&!_parent._showingAlert){

_parent.showNoPaintAlert();

}

if (!_parent.isDrawerOpen()&&mPaint!=null) {

float x = event.getX();

float y = event.getY();

if (x > myWidth) {

x = myWidth;

}

if (y > myHeight) {

y = myHeight;

}

switch (event.getAction()) {

case MotionEvent.ACTION_DOWN:

touch_start(x, y);

invalidate();

break;

case MotionEvent.ACTION_MOVE:

touch_move(x, y);

invalidate();

break;

case MotionEvent.ACTION_UP:

touch_up();

invalidate();

break;

}

return true;

} else {

return true;

}

}

public void clearCanvasCache() {

mBitmap = Bitmap.createBitmap((int) myWidth, (int) myHeight, Bitmap.Config.ARGB_8888);

mCanvas = new Canvas(mBitmap);

}

}

我应该补充一点,我将这个自定义视图添加到具有方格图案作为背景图像的相对布局中。

请请帮助..我需要使用橡皮擦涂料后不显示黑色的预览图像..我需要它来显示背后的方格图案..我知道橡皮擦正在工作,因为那些黑色橡皮擦标记保存为透明。

新笔记

我一直在玩,发现了一些好奇的东西。 试验,我尝试从绘图切换到canvas传递给onDraw方法,并直接到我在构造mCanvas设置的画布,并注意到它没有绘制到我能看到的..所以我添加了一个日志到像这样的onDraw :

protected void onDraw(Canvas canvas) {

Log.v("DRAWING SURFACE", "canvas:"+canvas+" mCanvas:"+mCanvas);

吐出来的

06-21 11:10:43.994: V/DRAWING SURFACE(4532): canvas:android.view.Surface$CompatibleCanvas@42a8c030 mCanvas:android.graphics.Canvas@431df180

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值