已经给出了你的问题的答案都指向了正确的方向:你需要在单独的图层中分离背景颜色块和前景图,然后合并它们,然后将它们全部保存在.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 XY 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); } }

android canvas 背景图片,Android更改canvas背景颜色而不会丢失任何图纸相关推荐

  1. 怎么更改锁定计算机背景图片,电脑锁屏背景图片如何更改 电脑背景图片怎么换不了...

    如何修改更换电脑桌面背景图片 win7更改桌面图片的方法: 1.首先用鼠标右键单击桌面的空白处.然后在弹出的菜单上选择"个性化"选项.这样就弹出了的个性化窗口上能显示看到" ...

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

    已经给出了你的问题的答案都指向了正确的方向:你需要在单独的图层中分离背景颜色块和前景图,然后合并它们,然后将它们全部保存在.png文件中.这就是Adobe Photoshop工作流程的设计--如果我们 ...

  3. android textview 背景图片,Android—TextView 背景颜色与背景图片设置

    Android TextView 背景颜色与背景图片设置,android textview 控件,android textview 背景, android textview 图片,android te ...

  4. table vue 背景图片_table中background背景图片自动拉伸

    解决android:background背景图片被拉伸问题 ImageView中XML属性src和background的区别: background会根据ImageView组件给定的长宽进行拉伸,而s ...

  5. java添加背景图片_Java怎么添加背景图片

    首先,导入相关的包: import java.awt.BorderLayout; import java.awt.Container; import javax.swing.ImageIcon; im ...

  6. html网页左侧背景,CSS设置html网页背景图片 CSS设置网页背景颜色

    CSS设置网页背景图片 CSS设置网页背景颜色技术教程篇 本篇DIVCSS5以布局思想介绍使用CSS设置实现网页背景技巧为主,希望对DIV CSS爱好者有帮助.通常对网页设置背景直接对body设置背景 ...

  7. CSS设置html网页背景图片 CSS设置网页背景颜色

    http://www.divcss5.com/jiqiao/j768.shtml CSS设置网页背景图片 CSS设置网页背景颜色技术教程篇 本篇DIVCSS5以布局思想介绍使用CSS设置实现网页背景技 ...

  8. java框体怎么添加背景图,文本框添加背景图片,文本框背景图片,public class

    文本框添加背景图片,文本框背景图片,public classpublic class WatermarkTextField extends JTextField { BufferedImage img ...

  9. java为文本框添加背景颜色,文本框添加背景图片,文本框背景图片,文本框添加水印[Java...

    文本框添加背景图片,文本框背景图片,文本框添加水印[Java 文本框添加水印 [Java]代码public class WatermarkTextField extends JTextField { ...

最新文章

  1. bat 取得服务列表_基于IDEA热部署更新服务器Tomcat类,服务器Tomcat热更新
  2. 【055】长江水文数据自动记录程序
  3. 【计算机网络】数据链路层 : 信道划分 介质访问控制 ( 数据链路 | 介质访问控制分类 | 频分多路复用 FDM | 时分多路复用 TDM | 波分复用 WDM | 码分多路复用 CDM 计算 )★
  4. 未来之路—写在大二结束之前
  5. Linux两个进程交换信息,如何在Linux中的进程之间交换二进制数据
  6. 计算机七个计算原理,计算机组成原理计算题(7页)-原创力文档
  7. python gifmaze_Windows平台python验证码识别
  8. [译]C# 7系列,Part 7: ref Returns ref返回结果
  9. RFM模型的理解和python案例分析
  10. 磁力计椭球拟合使用篇 IMU 加速度、电子罗盘校准
  11. 人才管理是什么意思_hr是什么意思(HR到底是干什么的?)
  12. embed预览pdf_09.html使用iframe、embed查看pdf不显示(未解决),使用pdf.js预览pdf
  13. RXJS Operators
  14. iosbanner_ios图片的局部拉伸-------App首页banner图的iPhone X适配
  15. 服务器挂硬盘 BIOS,TaiShan服务器通过BIOS格式化硬盘将硬盘中的残留数据擦除操作方法...
  16. 中易浏览器(enjoyie) 录音软件
  17. JAVA期末考广东科技学院,我是叩丁狼广州Java老学员,我来说说自己的故事
  18. ifup,ifdown命令详解
  19. c语言商场收款程序,c语言 如何用switch语句编写一个有关商场购物金额优惠的选择程式...
  20. 醇酰基转移酶基因对猕猴桃酯生物合成的作用

热门文章

  1. 扫描电子显微镜基本构造
  2. micropython移植教程_移植MicroPython到NUCLEO_L476RG开发板
  3. Php集福程序,2021 支付宝“集福”最全攻略,这样操作更快得“福”!
  4. 微信从原版到现在所有界面图片_微信这4张登录界面图,你见过几张?微信老用户都不一定能认全!...
  5. js实现用户输入年月份,判断是否为闰年,该月份有多少天
  6. WPF界面MahApps.Metro之应用
  7. Web two days
  8. matlab 椭圆方程拟合
  9. C入门学习之水仙花数个人总结
  10. 微信开发 缓存Storage