私はこの問題をグーグルで検索し、さまざまな解決策を提案しました。
しかし、どれも私にとってはうまくいきませんでした。
アプリに描画キャンバスがあります。
キャンバスの背景は、カスタム ビュー (drawView) を使用するアクティビティの 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 はインスタンス) では、描画されたパスを PathPaints のコレクションに格納します。これには 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.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);
}
ただし、これは問題です。元に戻す/やり直しを実行できるようにしたいからです (したがって、コレクションのポイント)。
誰でも私を助けてもらえますか?