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

绘制:

   @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;
       }           
   } 

水平翻转:

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

您需要从该视图创建位图,请参考绘图缓存,如这里

Android 2.1 View 的 getDrawingCache() 方法总是返回 null

现在尝试翻转这个位图

于 2013-02-22T12:36:26.643 回答