Снимок экрана SurfaceView с растровым содержимым

Я хочу захватить изображение вида поверхности с отображением содержимого на виде поверхности. В моем приложении у меня есть вид поверхности, на котором пользователь может нарисовать растровое изображение, перетащив на него некоторые объекты. После этого по нажатию кнопки я хочу сохранить изображение поверхности с его растровым содержимым на SD-карте.

Для этого у меня есть объект холста и все растровые изображения нарисованы на нем. ниже мой код -

                mHolder = mSurfaceView.getHolder();
                mHolder.lockCanvas();
                canvas.drawColor(0,Mode.CLEAR);
                //border's properties
                paint = new Paint();
                FontMetrics fm = new FontMetrics();
                Paint paint2 = new Paint();
                paint2.setColor(Color.WHITE);
                paint2.setTextSize(30);
                paint2.setTextAlign(Paint.Align.CENTER);
                paint2.getFontMetrics(fm);  
                canvas.drawText("Building", RectLeft+60, RectTop+60, paint2);
                paint.setStyle(Paint.Style.STROKE);
                paint.setColor(color);
                paint.setStrokeWidth(3);
                canvas.drawRect(RectLeft, RectTop, RectRight, RectBottom, paint);
                mHolder.unlockCanvasAndPost(canvas);

Как это сделать.

Заранее спасибо.

РЕДАКТИРОВАНИЕ

Ниже мой код, который захватывает только вид, который я создал в xml, а не рисует то, что у меня нарисовано на поверхности.

public static Bitmap getBitmapFromView(View view) {
    //Define a bitmap with the same size as the view
    Bitmap returnedBitmap = Bitmap.createBitmap(view.getWidth(), view.getHeight(),Bitmap.Config.ARGB_8888);
    //Bind a canvas to it
    Canvas canvas = new Canvas(returnedBitmap);
    //Get the view's background
    Drawable bgDrawable =view.getBackground();
    if (bgDrawable!=null) 
        //has background drawable, then draw it on the canvas
        bgDrawable.draw(canvas);
    else 
        //does not have background drawable, then draw white background on the canvas
        canvas.drawColor(Color.WHITE);
    // draw the view on the canvas
    view.draw(canvas);
    //return the bitmap
    return returnedBitmap;
}

РЕДАКТИРОВАНИЕ мой фрагмент отверстия для рисования ниже-

public class DrawingLayoutFragment extends Fragment implements SurfaceHolder.Callback{

      @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
  ....
  ....
   mSurfaceView = (SurfaceView) view.findViewById(R.id.surfaceview);
  init();
  return view;
}

public void init(){
    mSurfaceView.getHolder().addCallback(this);
}

@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
        int height) {
        RectLeft = width/2 - 60;
        RectTop = height/2 - 60 ;
        RectRight = width/2 + 60;
        RectBottom = height/2 + 60;
        DrawFocusRect(RectLeft, RectTop, RectRight, RectBottom, getResources().getColor(com.nep.R.color.white_color));
}

@Override
public void surfaceCreated(SurfaceHolder holder) {
    mHolder = mSurfaceView.getHolder();
}

@Override
public void surfaceDestroyed(SurfaceHolder holder) {
    try{
        if(mHolder!=null){
            mHolder.lockCanvas();
            canvas = null;
            mHolder.addCallback(null);
            mHolder = null;
        }
    }catch(Exception e){
        e.printStackTrace();
    }
}

 private void DrawFocusRect(float RectLeft, float RectTop, float RectRight, float RectBottom, int color){
         try {
                if(canvas!=null){
                    mHolder.lockCanvas();
                }
                else{
                    canvas = mHolder.lockCanvas();
                }
                canvas.drawColor(0,Mode.CLEAR);
                paint = new Paint();
                FontMetrics fm = new FontMetrics();
                Paint paint2 = new Paint();
                paint2.setColor(Color.WHITE);
                paint2.setTextSize(30);
                paint2.setTextAlign(Paint.Align.CENTER);
                paint2.getFontMetrics(fm);  
                canvas.drawText("Building", RectLeft+60, RectTop+60, paint2);
                paint.setStyle(Paint.Style.STROKE);
                paint.setColor(color);
                paint.setStrokeWidth(3);
                canvas.drawRect(RectLeft, RectTop, RectRight, RectBottom, paint);
                mHolder.unlockCanvasAndPost(canvas);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
      public void createFIle(){
    try {
        DrawFocusRect(RectLeft, RectTop, RectRight, RectBottom, getResources().getColor(com.nep.R.color.white_color));
         Bitmap b = Bitmap.createBitmap(mSurfaceView.getWidth(), mSurfaceView.getHeight(), Bitmap.Config.ARGB_8888); 
         Canvas c = new Canvas(b);
         mSurfaceView.draw(c);

    //  Bitmap bmp = getBitmapFromView(frame);

        String mFile = mPath+"_layout011.png";
        File directory = new File (mFile);
        directory.createNewFile();
        OutputStream fo = new FileOutputStream(directory);
        ByteArrayOutputStream os = new ByteArrayOutputStream();

        b.compress(CompressFormat.JPEG, 100, os);
        os.writeTo(fo);
        fo.close();
        os.close();
    //  mSurfaceView.destroyDrawingCache();
        BasicMethods.showToast("Saved at - "+mFile, mContext);
    } catch (Exception e) {
        e.printStackTrace();
    }
}
}

У меня есть пользовательский этот код, и он не работает, поэтому я помещаю свое поверхностное представление в другое представление и пытаюсь захватить растровое изображение из того, что я ранее опубликовал. Я пробовал оба пути, но не получал никакого решения.

1 ответ

Создайте растровое изображение, создайте Canvas для растрового изображения, выполните все команды рисования на этом Canvas, сохраните растровое изображение.

Вы не можете захватить поверхность SurfaceView, поэтому самый простой способ - перерисовать растровое изображение. Это приходит довольно часто; см. например это.

Другие вопросы по тегам