我已经在谷歌上搜索了这个问题,并提出了各种解决方案。
但是,没有一个对我有效。
我在一个应用程序中有一个绘图画布。
画布的背景被设置为活动中的png图像,该活动使用自定义视图(drawView);
Bundle extras = intent.getExtras();
if (extras != null) {
if (extras.containsKey("background")) {
//set the background to the resource in the extras
int imageResource = intent.getIntExtra("background",-1);
Drawable image = getResources().getDrawable(imageResource);
drawView.setBackground(image);
}
}
在DrawingView类(drawview是实例)中,我将绘制的路径存储在一个PathPaints集合中,该集合有3个属性(路径、使用的油漆以及如果是橡皮擦);
private ArrayList<PathPaint> paths = new ArrayList<PathPaint>();
protected void onDraw(Canvas canvas) {
//if the drawing is new - dont draw any paths
if (isNew != true) {
//go through every previous path and draw them
for (PathPaint p : paths) {
if (!p.isErase)
{
canvas.drawPath(p.myPath, p.myPaint);
}
else
{
//Paint eraserPaint = setDefaultPaint();
//eraserPaint.setAlpha(0xFF);
//eraserPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
//eraserPaint.setColor(Color.TRANSPARENT);
//canvas.drawBitmap(canvasBitmap, 0, 0, canvasPaint);
canvas.drawPath(p.myPath, p.myPaint);
}
canvas.drawBitmap(canvasBitmap, 0, 0, null);
}
}
我已经尝试在drawpath上设置油漆,以设置所有各种注释掉的属性。
我已经尝试在位图上绘制,然后将该位图加载到画布(canvas.drawbitmap(canvasBitmap,0,0,null))
我已经关闭了这个类的构造函数中的硬件加速
setLayerType(View.LAYER_TYPE_SOFTWARE, null);
//If we are making a new drawing we don't want to go through all the paths
if (isNew != true && erase ==false) {
//go through every previous path and draw them
for (PathPaint p : paths) {
if (!p.isErase)
{
canvas.drawPath(p.myPath, p.myPaint);
}
//this section now takes place in the elseIF
else
{
Paint eraserPaint = setDefaultPaint();
eraserPaint.setAlpha(0xFF);
eraserPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
eraserPaint.setColor(Color.TRANSPARENT);
canvas.drawBitmap(canvasBitmap, 0, 0, canvasPaint);
canvas.drawPath(p.myPath, p.myPaint);
}
}
}
else if (isNew != true && erase ==true)
{
//This works correctly for Erasing but I dont have the ability to Undo/Redo with this approach!
canvas.drawBitmap(canvasBitmap, 0, 0, canvasPaint);
canvas.drawPath(drawPath, drawPaint);
}
看起来您只使用一个视图(层),首先放置背景图像,然后绘制路径,这些路径替换了背景。如果是这样,当您擦除时,您将从唯一的视图/层中移除,其中包括路径和背景。如果使用两个层(Framelayout中的两个视图),一个在后面,在那里加载背景,一个在前面,在那里放置所有的路径,那么在顶层擦除只是删除路径,背景就会通过。
分层有不同的方法。例如,这个FrameLayout替换了当前保存背景和绘制路径的视图(在代码中称为XXXView)
<FrameLayout
android:layout_width= ...copy from the existing XXXView ...
android:layout_height= ...copy from the existing XXXView ... >
<ImageView
android:id = "@+id/background"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
...
... the background is loaded here />
<XXXView (this the existing view where the paths are drawn onto)
android:layout_width="fill_parent"
android:layout_height="fill_parent"
...
... no background here />
</FrameLayout>
我想使用Fabric.js在我的web应用程序中实现eraser。在Fabric.js中有没有实现橡皮擦的方法?例如,如在MS Paint?
在画布上画画是非常好的。即使橡皮擦也能工作得很好。问题是当画布保存为图像时,它画的是黑线,而不是橡皮擦。 为了更好地理解,我添加了屏幕、镜头和代码。 1.在擦除图的同时- 我不明白为什么橡皮移动被替换为黑色,而保存画布作为一个图像。
我正在一个绘画应用程序,与撤消/重做功能,并希望添加橡皮擦功能。 橡皮擦上的代码怎么写得合适?(保留撤消/重做) 提前多谢!
我已经创建了一个HTML5绘图应用程序,它具有基本功能,允许用户选择一种颜色来绘制,改变绘图工具的大小(半径),撤消,重做,以及完全清除画布。 我最近添加了一个橡皮擦工具,使用globalCompositionProperty(desitnation-out)擦除画布的选定区域。这部分工作良好,但当我去撤销擦除,整个画布被清除,重做功能不起作用。当我用常规的绘图工具(使用source-over)恢
我试图将一个半透明的橡皮刷写进我正在开发的应用程序中,但发现了两个问题,这取决于它的实现方式。希望有一个解决办法,我可以指出。 代码示例在mono droid/xamarin中 所以,我通常有一个设置,在画布上绘制路径。我的视图的方法绘制它的基本位图,然后在其上绘制我的路径。 有人有什么东西我可以看一下,可以提出解决方案吗?Java很好,因为它很容易移植到C#。 多谢!奈杰尔
我试图创建一个自定义视图,工作简单:有一个位图显示由弧路径-从0deg到360deg。度随着一些fps而变化。 我的问题是--如何设置模式以使其工作透明? 当然,是32位PNG,带有alpha通道。