0

私はパスを使用してキャンバスとビットマップについて学習しており、現在、ユーザーが拡張ビューで自由にパスを描画できる描画アプリに取り組んでいます。このアプリでは、ユーザーがビットマップを背景としてインポートして描画することもできます。

DoodleViewという名前のビューを拡張します。

   public DoodleView(Context context, AttributeSet attrs) 
   {
       super(context, attrs); // pass context to View's constructor
       this.context_new=context;
       setFocusable(true);
       setFocusableInTouchMode(true);
   } // end DoodleView constructor

onDraw:

   @Override
   protected void onDraw(Canvas canvas) 
   {
       canvas.drawBitmap(bitmap, 0, 0, null); 
       for (Path p : paths)
       {
           paintLine.setColor(colorsMap.get(p));
           canvas.drawPath(p, paintLine);          
       }       
       paintLine.setColor(selectedColor);
       canvas.drawPath(mPath, paintLine);   

       if (ConvertCanvasToBitmap == true) 
       {
           canvas.drawBitmap(bitmap, 0, 0, paintLine);
           ConvertCanvasToBitmap = false;
       }           
   } 

FlipHorizo​​ntally:

public void flipImageHorizontally()  
{       
    ConvertCanvasToBitmap = true;
    invalidate();           
    Matrix flipHorizontalMatrix = new Matrix();
    flipHorizontalMatrix.setScale(-1,1);
    flipHorizontalMatrix.postTranslate(bitmap.getWidth(),0);

    Bitmap HorizontalFlipped = Bitmap.createBitmap
            (bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), flipHorizontalMatrix, true);
    bitmap = HorizontalFlipped;
    invalidate();       
}

質問:

私の目標は、すでに描画されているパスの場合、ユーザーが画像を反転しようとすると、描画されたパスも反転することです。(つまり、パスはすでにイメージの一部になっており、ユーザーはパスを元に戻すことができなくなります)。

ただし、上記のコードを使用してテストしました。フリップボタンを押すと、ビットマップの背景をフリップできますが、描画されたものは消えます。そして、さらに描画すると、パスが再び表示されますが、反転しないままになります。

要するに、フリップボタンが押されたときにパスをビットマップの一部にする方法は?

ありがとう!

編集:

Android 2.1 ViewのgetDrawingCache()メソッドは常にnullを返すことに基づいてonDraw、次のコードでを変更しましたが、

02-22 21:38:34.685: E/AndroidRuntime(18617): java.lang.NullPointerException
02-22 21:38:34.685: E/AndroidRuntime(18617):    at android.graphics.Bitmap.createBitmap(Bitmap.java:455)
02-22 21:38:34.685: E/AndroidRuntime(18617):    at com.pearmak.drawing.DoodleView.onDraw(DoodleView.java:148)

変更されたコード:

   @Override
   protected void onDraw(Canvas canvas) 
   {
       canvas.drawBitmap(bitmap, 0, 0, null); // draw the background screen

       for (Path p : paths)
       {
           paintLine.setColor(colorsMap.get(p));
           paintLine.setStrokeWidth(widthMap.get(p));
           canvas.drawPath(p, paintLine);          
       }       
       paintLine.setColor(selectedColor);
       paintLine.setStrokeWidth(selectedWidth);
       canvas.drawPath(mPath, paintLine);   

       if (ConvertCanvasToBitmap == true) 
       {
           //Method 1
//         RelativeLayout page = (RelativeLayout) findViewById(R.id.doodleView);
//         Bitmap screenshot = Bitmap.createBitmap(page.getWidth(), page.getHeight(), Config.ARGB_8888);
//         bitmap = screenshot;
//         ConvertCanvasToBitmap = false;

           //Method 2
           Bitmap screenshot2;
               layout(0, 0, DoodlzViewWidth, DoodlzViewHeight);
           setDrawingCacheEnabled(true);
           screenshot2 = Bitmap.createBitmap(getDrawingCache()); // LINE 148
           setDrawingCacheEnabled(false);
           bitmap = screenshot2;
       }           
   } 
4

1 に答える 1

0

そのビューからビットマップを作成する必要があります ここのような drawingcache を参照してください

Android 2.1 View の getDrawingCache() メソッドが常に null を返す

このビットマップを反転してみてください

于 2013-02-22T12:36:26.643 に答える