4

私は自分の割り当てのためにAndroidプロジェクトに取り組んでいます。スクラッチ画像アプリケーションを作成しようとしています。画面をスクラッチしてブロックレイヤーを削除して画像を表示するようなものです。しかし、問題はどこから始めればいいのかわからないことです。

私はこれに関連するstackoverflowの質問を検索していますが、それは役に立ちません。そこでの検索から、このプロジェクトの手がかりが使用されていることがわかりましたBitmap.getPixel(int x, int y)

だから、私の考えでは、ビットマップからピクセルを取得し、それをキャンバスにペイントする必要があります。しかし、私はそれを実装する方法がわかりませんか?または誰かがこれのためのより良い方法を持っていますか?

誰か助けてくれませんか?この種のことや関連するトピックに関するチュートリアルはありますか?

前もって感謝します!


これが私のサンプルコードです:

@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
    super.onSizeChanged(w, h, oldw, oldh);
    tw = w;
    th = h;
    eraseableBitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
    mCanvas = new Canvas(eraseableBitmap);
    Bitmap muteableBitmap = Bitmap.createBitmap(eraseableBitmap.getWidth(), eraseableBitmap.getHeight(), Bitmap.Config.ARGB_8888);
}

@Override
public boolean onTouchEvent(MotionEvent event) {
    static_x = event.getX();
    static_y = event.getY();

    if (event.getAction() == MotionEvent.ACTION_DOWN) {
        touch_start(static_x, static_y);

    } if (event.getAction() == MotionEvent.ACTION_MOVE) {
            touch_move(static_x, static_y);

    } if (event.getAction() == MotionEvent.ACTION_UP) {
            touch_up(); 
        }
    return true;
}

これが私のプロジェクトの外観です。

レイアウト

4

4 に答える 4

7

興味深い質問です。私の理論的計画:

'消去可能'ビットマップと'非表示'ビットマップの2つのビットマップがあります。Androidのビットマップは不変であるため、既存のビットマップからピクセルを消去することはできません。したがって、「消去可能」ビットマップからピクセルを消去して下のビットマップを表示する代わりに、最初に「消去可能」ビットマップを描画します。次に、空の可変ビットマップを作成します。「非表示」ビットマップ内のすべてのピクセルをループし、「消去可能」ビットマップが「消去」された場所のみを表示します。

Bitmap mutableBitmap = Bitmap.create(erasableBitmap.getWidth(),erasableBitmap.getHeight(), Bitmap.Config.ARGB_8888);

for(Pixel erasedPixel : erasedList)
{
  mutableBitmap.setPixel(x,y, hiddenBitmap.getPixel(erasedPixel.x, erasedPixel.y));
}

...
// in a different file
class Pixel{
  int x, y;

}

自分でerasedListに入力する必要があります。

完了したら、次のようにキャンバスに描画します。

canvas.drawBitmap(0,0,eraseableBitmap);
canvas.drawBitmap(0,0,mutableBitmap);

新しいピクセルで描画されるように、最初に「消去可能」ビットマップを描画するようにしてください。

消去されたピクセルを設定する方法を理解するのに助けが必要な場合は、コメントで知らせてください。私がお手伝いします。

編集

ユーザーが消去しようとしたピクセルを実際に把握するには:ビューで、onTouchイベントをキャプチャすると、ユーザーが画面に触れた場所の座標が取得されます。それをある種のマップまたはハッシュテーブルに保存すれば、うまくいくはずです。Pixelオブジェクトを作成し、それをListピクセルのグローバルに追加します。

編集2

「スクラッチ」のサイズを大きくするためにあなたがしなければならないことは少し複雑です。タッチされたx、yポイントの周囲に領域を作成して、消去されたものとしてカウントする方法が必要です。円が理想的ですが、正方形を使用する方が簡単です。

for(Pixel erasedPixel: erasedList)
{
  //it's actually more complicated than this, since you need to check for boundary conditions.
  for(int i = -SQUARE_WIDTH/2; i < SQUARE_WIDTH/2; i++){
    for(int j = -SQUARE_WIDTH/2; j < SQUARE_WIDTH/2; j++){
      mutableBitmap.setPixel(erasedPixel.x+i, erasedPixel.y+j, hiddenBitmap.getPixel(erasedPixel.x+i, erasedPixel.y+j));
    }
  }
}
于 2012-06-08T03:21:23.197 に答える
4

WScrarchViewというライブラリを作成しました。このライブラリでは、レイアウトxmlに数行だけスクラッチビューを実装できます。これがまだ同様のソリューションを探している人に役立つことを願っていますhttps://github.com/winsontan520/Android-WScratchView

もちろん、コードをコピーして、ニーズに基づいてカスタマイズすることもできます:)

于 2013-01-19T16:45:50.253 に答える
1

最も単純な解決策は、2つのレイヤーを重ねることだと思います(RelativeLayoutで簡単に実現できます)。最下層には、公開する必要のあるコンテンツがすべて含まれます。最上層は不透明な色で満たされたキャンバスです。タッチイベントを検出したら、指のトレースを開始し、同じパス上の古い色を置き換えて完全に透明な色をペイントします。指でペイントする方法のチュートリアルはここにあります

于 2012-06-11T02:00:37.317 に答える
-1

samsung S-Pen SDkを使用して画像を無料でスクラッチできますが、2.3OSバージョンからは機能します

于 2012-06-08T04:20:50.507 に答える