android 设置画布颜色,Android更改画布背景颜色而不会丢失任何图纸

已经给出了你的问题的答案都指向了正确的方向:你需要在单独的图层中分离背景颜色块和前景图,然后合并它们,然后将它们全部保存在.png文件中.这就是Adobe Photoshop工作流程的设计……如果我们考虑它,它确实有意义:例如像MsPaint这样的软件:因为它不使用图层,它必须依赖于类似填充算法的东西完成(虽然以不完整的方式)远程类似于背景变化的东西……

实现这种方法的一种方法是实例化由2个不同位图支持的2个Canvas对象.第一个Canvas-Bitmap对将用于前景中的绘制,第二个Canvas-Bitmap对将用于合并图层绘制(即前景绘制背景颜色块).然后第二个位图将在您需要保存时保存到.png文件中.这样,我们的第一个Canvas-Bitmap对存储了您的前景信息,如果需要进行背景颜色更改,则不会销毁该信息.每次进行操作时,图层都可以合并到第二个Canvas-Bitmap对中,这样总有一个Bitmap具有正确的内容,可以随心所欲地保存.

这是我制作的自定义视图,以便清除此方法.它实现了一个简单的视图,用于使用手指在触摸屏上绘制蓝线,背景颜色根据所述手指的XY位置而变化,以便演示背景颜色变化,而没有完整实现固有的不必要的代码复杂性带色轮/菜单/除其他外:

package com.epichorns.basicpaint;

import android.content.Context;

import android.graphics.Bitmap;

import android.graphics.Canvas;

import android.graphics.Paint;

import android.graphics.Point;

import android.graphics.Paint.Style;

import android.view.View;

public class PaintView extends View{

Bitmap mMergedLayersBitmap=null; //Note: this bitmap here contains the whole of the drawing (background+foreground) to be saved.

Canvas mMergedLayersCanvas=null;

Bitmap mBitmap = null; //bitmap onto which we draw our stuff

Canvas mCanvas = null; //Main canvas. Will be linked to a .bmp file

int mBackgroundColor = 0xFF000000; //default background color

Paint mDefaultPaint = new Paint();

Paint mDrawPaint = new Paint(); //used for painting example foreground stuff... We draw line segments.

Point mDrawCoor = new Point(); //used to store last location on our PaintView that was finger-touched

//Constructor: we instantiate 2 Canvas-Bitmap pairs

public PaintView(Context context, int width, int height) {

super(context);

mMergedLayersBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);

mMergedLayersCanvas = new Canvas(mMergedLayersBitmap);

mBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);

mCanvas = new Canvas(mBitmap);

}

//Change background color

public void changeColor(int newColor){

mBackgroundColor = newColor;

invalidate(); //refresh view: this will indirectly invoke onDraw soon afterwards

}

//Called by user of PaintView in order to start a painting "stroke" (finger touching touch-screen): stores the

//location of the finger when it first touched the screen

public void startDraw(int x, int y, int radius, int color){

mDrawPaint.setColor(color);

mDrawPaint.setStyle(Style.STROKE);

mDrawPaint.setStrokeWidth(radius);

mDrawCoor.x = x;

mDrawCoor.y = y;

}

//Called by user of PaintView when finger touching touch-screen is moving (must be called after a startDraw,

//as the latter initializes a couple of necessary things)

public void continueDraw(int x, int y){

mCanvas.drawLine(mDrawCoor.x, mDrawCoor.y, x, y, mDrawPaint);

mDrawCoor.x = x;

mDrawCoor.y = y;

invalidate(); //refresh view: this will indirectly invoke onDraw soon afterwards

}

//Merge the foreground Canvas-Bitmap with a solid background color, then stores this in the 2nd Canvas-Bitmap pair.

private void mergeLayers(){

mMergedLayersCanvas.drawColor(mBackgroundColor);

mMergedLayersCanvas.drawBitmap(mBitmap, 0, 0, mDefaultPaint);

}

@Override

public void onDraw(Canvas canvas){

mergeLayers();

canvas.drawBitmap(mMergedLayersBitmap, 0, 0, mDefaultPaint);

}

}

为了测试这个视图,这里是一个使用PaintView类的测试Activity.这两个文件在Android项目中都是自给自足的,因此您可以在真实设备上进行测试而不会有麻烦:

package com.epichorns.basicpaint;

import android.app.Activity;

import android.graphics.Color;

import android.os.Bundle;

import android.util.Log;

import android.view.Display;

import android.view.MotionEvent;

import android.view.View;

import android.widget.LinearLayout;

import com.epichorns.basicpaint.PaintView;

public class BasicPaintActivity extends Activity {

PaintView mPaintView=null;

LinearLayout mL = null;

boolean mIsDrawing=false;

int mBackgroundColor = 0xFF000000;

/** Called when the activity is first created. */

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

Display display = getWindowManager().getDefaultDisplay();

final float dispWidth = (float)display.getWidth();

final float dispHeight = (float)display.getHeight();

mPaintView = new PaintView(this, display.getWidth(), display.getHeight());

mPaintView.changeColor(mBackgroundColor);

mPaintView.setOnTouchListener(new View.OnTouchListener(){

public boolean onTouch(View v, MotionEvent event) {

if(event.getAction()==MotionEvent.ACTION_DOWN){

mPaintView.startDraw((int)event.getX(), (int)event.getY(), 6, 0x806060FF);

mIsDrawing=true;

return true;

}

else if(event.getAction()==MotionEvent.ACTION_UP){

mIsDrawing=false;

return true;

}

else if(event.getAction()==MotionEvent.ACTION_MOVE){

if(mIsDrawing){

//To demonstrate background change, change background color depending on X-Y position

int r = (int)(255f*event.getX()/dispWidth);

int g = (int)(255f*event.getY()/dispHeight);

mBackgroundColor = Color.argb(0xFF, r,g, 0x00);

Log.d("DEBUG1", "Color channels: (r, g) = ("+String.valueOf(r)+", "+String.valueOf(g)+")");

mPaintView.changeColor(mBackgroundColor);

//now, draw stuff where finger was dragging...

mPaintView.continueDraw((int)event.getX(), (int)event.getY());

return true;

}

else{

return false;

}

}

return false;

}

});

setContentView(mPaintView);

}

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值