android - 如何以编程方式截取绘图表面的屏幕截图

标签 android

我正在编写一个应用程序,用户可以在其中从图库中选择一个图像,并且可以使用 DrawingSurface 在其上画笔,现在我想以编程方式获取 View 的屏幕截图。我已经完成了一个 Activity 的屏幕截图,但我无法截取 DrawingSurface 的屏幕截图。下面是我的 XML 代码

<RelativeLayout 
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >

<Holi_app.in.DrawingSurface
    android:id="@+id/drawingSurface"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />

<LinearLayout
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="horizontal" >


</LinearLayout>

</RelativeLayout>

这是我的 Java 类

public class DrawingSurface extends SurfaceView implements SurfaceHolder.Callback 
{


private Boolean _run;
protected DrawThread thread;
Bitmap mBitmap;
Context context;
int flag=0;
String mImagePath;
File file;  
String savedFilePath = "";
private boolean isFileAlreadySaved = false;

private CommandManager commandManager;
private Canvas canvas;   

SurfaceView v;

public DrawingSurface(Context context, AttributeSet attrs)
{
    super(context, attrs);

    String tag=PreferenceConnector.readString(context, PreferenceConnector.IMAGE_TAG,"ab"); 

     if(tag.equals("ab"))
     {
         mBitmap = BitmapFactory.decodeResource(getResources(),R.drawable.abdraw); 
     }


    getHolder().addCallback(this);


    commandManager = new CommandManager();
    thread = new DrawThread(getHolder());


}


class DrawThread extends  Thread
{
    private SurfaceHolder mSurfaceHolder;


    public DrawThread(SurfaceHolder surfaceHolder)
    {
        mSurfaceHolder = surfaceHolder;

    }

    public void setRunning(boolean run)
    {
        _run = run;
    }


    DrawingActivity image=new DrawingActivity();

    @Override
    public void run() 
    {
        Canvas canvas = null;

        while (_run)
        {
            try
            {                   



                canvas = mSurfaceHolder.lockCanvas(null);                
                canvas.drawBitmap(mBitmap, 0, 0, null);
                commandManager.executeAll(canvas);
                    mSurfaceHolder.unlockCanvasAndPost(canvas);
            }
            catch(Exception e)
            {
                e.printStackTrace();
            }

        }

    }


}


public void addDrawingPath (DrawingPath drawingPath)
{
    commandManager.addCommand(drawingPath);
}

public boolean hasMoreRedo()
{
    return commandManager.hasMoreRedo();
}

public void redo()
{
    commandManager.redo();
}

public void undo()
{
    commandManager.undo();
}

public boolean hasMoreUndo()
{
    return commandManager.hasMoreRedo();
}


public void surfaceChanged(SurfaceHolder holder, int format, int width,  int height)
{
    // TODO Auto-generated method stub
}

public void surfaceCreated(SurfaceHolder holder) 
{
    // TODO Auto-generated method stub
    thread.setRunning(true);
    thread.start();
}

public void surfaceDestroyed(SurfaceHolder holder) 
{
    // TODO Auto-generated method stub
    boolean retry = true;
    thread.setRunning(false);
    while (retry) 
    {
        try 
        {
            thread.join();
            retry = false;
        }
        catch (InterruptedException e) 
        {
            // we will try it again and again...
        }
    }
}
public void Save(String mImagePath, String savedFilePath2)
{

   this.mImagePath=mImagePath;  
   this.savedFilePath=savedFilePath2;
   System.out.println("here imagepath"+mImagePath);
   if(isFileAlreadySaved == false)
   {
                this.setDrawingCacheEnabled(true);
       mBitmap=getDrawingCache();
         Calendar currentDate = Calendar.getInstance();
          SimpleDateFormat formatter= new SimpleDateFormat("yyyyMMMddHmmss");
          String dateNow = formatter.format(currentDate.getTime());          
          file = new File(savedFilePath);
          FileOutputStream fos;
          try {
           fos = new FileOutputStream(file);
           mBitmap.compress(Bitmap.CompressFormat.PNG, 100, fos);
           fos.close();
           isFileAlreadySaved = true;
          } 
          catch (FileNotFoundException e)
          {
           Log.e("Panel", "FileNotFoundException", e);
          } 
          catch (IOException e) {
           Log.e("Panel", "IOEception", e);
       }

}
    }

    }

最佳答案

试试这个

 GameBoard gameBoard = (GameBoard)findViewById(R.id.the_canvas);
gameBoard.save();

View类的GameBoard名称

public void save() {
        // TODO Auto-generated method stub

//       File folder = new File(Environment.getExternalStorageDirectory()+"/folder/");
//          if(!folder.exists()) folderAppointment.mkdirs();
        flag=false;

            try {
                this.setDrawingCacheEnabled(true);
                FileOutputStream fos = new FileOutputStream(new File(Environment.getExternalStorageDirectory()+"/filetosave4.jpg"));
                mBitmap = this.getDrawingCache();
                mBitmap.compress(CompressFormat.JPEG, 100, fos);
                fos.flush();
                fos.close();
//              Toast.makeText(getContext(), "Saved to "+fos, Toast.LENGTH_LONG).show();
               next();

            } catch (FileNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            finally
            {
                Log.d("Flag",""+flag);
            }

    }

也试试这个

private void saveBitmap(File file) {
        try {
            FileOutputStream fos = new FileOutputStream(file);
            Bitmap bitmap = context.getSurface().getBitmap();
            if (bitmap == null) {
                return;
            }
            bitmap.compress(CompressFormat.PNG, 100, fos);
        } catch (FileNotFoundException e) {
            throw new RuntimeException(e);
        }
    }

关于android - 如何以编程方式截取绘图表面的屏幕截图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15130890/

相关文章:

android - 如何组合两个数组列表并在android中的 ListView 中显示

android - 从 BLE v4.2 到 4.0 的有效载荷大小的向后兼容性

android - Nexus 5/6 Lollipop 上的 "Too Many Files"错误

javascript - 我如何告诉 react-native 要查看的 .env 文件?

java - 如何从复选框 ListView 将变量设置为 true/false?

java - 当似乎没有必要时将上下文存储在适配器中

Android NDK SIGILL 在 ARMv6 设备上的 fpu 指令崩溃

android - 从代码 [root] 读取当前 APN 名称

android - 从 Kotlin 中的字符串创建数据类对象的 ArrayList

android - 垂直布局,2 个元素,让顶部的元素填充剩余空间(底部的元素有 wrap_content)