gpt4 book ai didi

android - Canvas Eraser 正在绘制一条黑线

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:07:24 53 4
gpt4 key购买 nike

我用谷歌搜索了这个问题并提出了各种解决方案。
但是,没有一个对我有用。

我在应用程序中有一个绘图 Canvas 。
在使用自定义 View (drawView)的Activity中将canvas的背景设置为png图片;

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 是实例)中,我将绘制的路径存储在 PathPaint 的集合中,该集合具有 3 个属性(路径、使用的油漆以及是否为橡皮擦);

private ArrayList<PathPaint> paths = new ArrayList<PathPaint>();

然后我尝试在 OnDraw 中循环遍历这些路径,并每次使用绘制它们时所用的颜料(多种颜色)重新绘制它们;

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);

}
}

我在网上尝试了很多建议的选项,但都无济于事。

我已经尝试在绘图路径上设置绘画以设置所有各种注释掉的属性。

我尝试在位图上绘图,然后将该位图加载到 Canvas (canvas.drawBitmap(canvasBitmap, 0, 0, null))

我已经在这个类的构造函数中关闭了硬件加速

setLayerType(View.LAYER_TYPE_SOFTWARE, null);

但是要么没有画线,要么当集合重画路径时,橡皮擦画了一条黑线;

enter image description here

有趣的是,如果我在没有循环方面使用位图执行删除 - 橡皮擦会按预期工作;

//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);

}

然而,这是一个问题,因为我希望能够撤消/重做删除(因此是收藏的重点)

谁能帮帮我?

最佳答案

看起来您只使用了一个 View (图层),您首先在其中放置背景图像,然后绘制替换背景的路径。如果是这样,当您删除时,您将从那个唯一的 View /图层中删除,其中包括路径和背景。如果您使用两层(Framelayout 中的两个 View ),一层在后面加载背景,另一层在前面放​​置所有路径,然后删除顶层只会删除路径和背景通过。

分层有不同的方法。例如,这个 FrameLayout 替换了当前持有背景和绘制路径的 View (在代码中称为 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>

关于android - Canvas Eraser 正在绘制一条黑线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37378268/

53 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com