我写了一个简单的surfaceview的游戏框架。开启一个线程,不停地绘制。现在我想需要一个当前画面的截图。查了半天 没什么资料。有大神帮忙吗?
请不要回答类似以下的代码:
mainBoard.setDrawingCacheEnabled(true);
mainBoard.buildDrawingCache();
Bitmap bitmap = mainBoard.getDrawingCache();

这个对于普通的view 还是可以的。但是surfaceview不行。
另外在Iteye上有一个美女写了一个,需要导入jar包,但是给的jar包导入进去 也没什么反应 运行的还报错。请问有没有什么好的解决方案。谢谢了
版主 2# David_Zhang 发表于 2012-2-21 20:42:58
对于surfaceview使用buildDrawingCache是不行的
可以通过SurfaceHolder来变通地截屏
你在线程里面是否使用下面的方式不停地绘图
canvas = mHolder.lockCanvas();
if (canvas != null) {
     把surfaceview的内容绘制到canvas 上
      surfaceview.doDraw(canvas);
      mHolder.unlockCanvasAndPost(canvas);
}

有了这一点应该就比较好理解了,上面的canvas其实是绘制到屏幕上的,可以使用一个bitmap创建一个canvas,然后把surfaceview绘制到这个canvas上就行了
Bitmap bitmap = Bitmap.createBitmap(getWidth(), getHeight(), Bitmap.Config.ARGB_8888);
Canvas bitCanvas = new Canvas(bitmap);
surfaceview.doDraw(bitCanvas);
~~阿凡达这部电影告诉我们,谁胯下的鸟大听谁的~~
见习构架师 3# zl56773282 发表于 2012-2-22 10:26:09
David_Zhang 发表于 2012-2-21 20:42
对于surfaceview使用buildDrawingCache是不行的
可以通过SurfaceHolder来变通地截屏
你在线程里面是否使用 ...

你好 首先谢谢你的回答 ,我按照你的方法做了。没有使用canvas = mHolder.lockCanvas(); 而是自己创建的canvas,但是这个时候,屏幕上就是一片黑的啊 什么也看不见 而且 我在保存自己生成Bitmap bitmap = Bitmap.createBitmap(getWidth(), getHeight(), Bitmap.Config.ARGB_8888); 的时候,还是看不见图像。。

package com.pica.whiteboard.view;

import java.util.ArrayList;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

import com.pica.whiteboard.activity.R;
import com.pica.whiteboard.util.PaintHolder;

public class PaletteView extends SurfaceView implements Runnable, SurfaceHolder.Callback{
        private Paint mPaint = null;
       
        //定义集合,存储画笔动作
        private ArrayList<Action> actionList;
        private Action curAction = null;
       
        boolean mLoop = true;
        SurfaceHolder mSurfaceHolder = null;
        Bitmap bgBitmap = null;  //背景
        Bitmap tempBitmap = null; //临时画板
       
        public PaletteView(Context context) {
                super(context);
                this.mPaint = new Paint();
                this.actionList = new ArrayList<Action>();       
                mSurfaceHolder = this.getHolder();
                mSurfaceHolder.addCallback(this);
                this.setFocusable(true);
                mLoop = true;
               
//                bgBitmap = BitmapFactory.decodeStream(getResources().openRawResource(R.drawable.defaultbgimg));
                bgBitmap = Bitmap.createBitmap(320, 320, Config.ARGB_8888);
                tempBitmap = Bitmap.createBitmap(320, 320, Config.ARGB_8888);
               
                new Thread(this).start();
        }

       
       
        private void Draw() {
//                Canvas canvas = mSurfaceHolder.lockCanvas();
                Canvas canvas = new Canvas(bgBitmap);
                if (mSurfaceHolder == null || canvas == null) {
                        return;
                }
//                canvas.drawColor(Color.parseColor("#00000000"));
                // 设置画笔没有锯齿,空心
                mPaint.setAntiAlias(true);
                mPaint.setStyle(Paint.Style.STROKE);

                // 画板绘图区背景图片
                canvas.drawBitmap(bgBitmap, 0, 0, null);
                canvas.drawColor(Color.parseColor("#FFFFFFFF"));
               
//                tempBitmap = Bitmap.createBitmap(bgBitmap.getWidth(), bgBitmap.getHeight(), Config.ARGB_4444);
                tempBitmap = Bitmap.createBitmap(320, 320, Config.ARGB_8888);
                Canvas canvasTemp = new Canvas(tempBitmap);
                canvasTemp.drawColor(Color.TRANSPARENT);
               
                for(int i=0;i <= PaintHolder.curIndex; i++){
                        actionList.get(i).draw(canvasTemp);
                }
                // 画当前画笔痕迹
                if (curAction != null) {
                        curAction.draw(canvasTemp);
                }
               
                // 在主画板上绘制临时画布上的图像
                canvas.drawBitmap(tempBitmap, 0, 0, null);
               
//                mSurfaceHolder.unlockCanvasAndPost(canvas);
        }
       
        //触屏事件
        @Override
        public boolean onTouchEvent(MotionEvent event) {
                int mAction = event.getAction();
                if(mAction == MotionEvent.ACTION_CANCEL) {
                        return false;
                }
               
                float touchX = event.getX();
                float touchY = event.getY();
               
                //点击时
                if(mAction == MotionEvent.ACTION_DOWN) {
                        setCurAction(touchX, touchY);
                        clearSpareAction();
                }
               
                // 拖动时
                if (mAction == MotionEvent.ACTION_MOVE) {
                        if (curAction != null) {
                                curAction.move(touchX, touchY);
                        }
                }
                // 抬起时
                if (mAction == MotionEvent.ACTION_UP) {
                        if (curAction != null) {
                                curAction.move(touchX, touchY);
                                actionList.add(curAction);
                                PaintHolder.curIndex++;
                                curAction = null;
                        }
                }
                return super.onTouchEvent(event);
        }
       
        public void setCurAction(float x, float y) {
                switch(PaintHolder.curTool) {
                case 0:
                        curAction = new MyPath(x, y, PaintHolder.curSize, PaintHolder.curColor);
                        break;
                case 1:
                        curAction = new MyLine(x, y, PaintHolder.curSize, PaintHolder.curColor);
                        break;
                case 2:
                        curAction = new MyCircle(x, y, PaintHolder.curSize, PaintHolder.curColor);
                        break;
                case 3:
                        curAction = new MyRect(x, y, PaintHolder.curSize, PaintHolder.curColor);
                        break;
                case 4:
                        curAction = new MyFillRect(x, y, PaintHolder.curSize, PaintHolder.curColor);
                        break;
                case 5:
                        curAction = new MyFillCircle(x, y, PaintHolder.curSize, PaintHolder.curColor);
                        break;
                case 6:
                        curAction = new MyEraser(x, y, PaintHolder.curSize, PaintHolder.curColor);
                        break;
                }
        }
       
        public void surfaceCreated(SurfaceHolder holder) {
                // TODO Auto-generated method stub
               
        }

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

        public void surfaceDestroyed(SurfaceHolder holder) {
                // TODO Auto-generated method stub
               
        }

        public void run() {
                while (mLoop) {
                        try {
                                Thread.sleep(50);
                        } catch (InterruptedException e) {
                                e.printStackTrace();
                        }
                        synchronized (mSurfaceHolder) {
                                Draw();
                        }
                }
        }
       
        // 后退前进完成后,缓存的动作
        private void clearSpareAction() {
                for (int i = actionList.size() - 1; i > PaintHolder.curIndex; i--) {
                        actionList.remove(i);
                }
        }
       
        public int getListLength() {
                return this.actionList.size();
        }

        public Bitmap getBitMap(){
                return this.bgBitmap;
        }
}
见习构架师 4# zl56773282 发表于 2012-2-23 11:42:49
David_Zhang 发表于 2012-2-21 20:42
对于surfaceview使用buildDrawingCache是不行的
可以通过SurfaceHolder来变通地截屏
你在线程里面是否使用 ...

多谢 LZ 我终于懂了...昨天没有理解透..效果做出来了...十分感谢 但是还是有一点 小小的毛病 就是每次截图的时候虽然可以截图成功 但是导出工程的时候是没有办法预览的 必须关闭eclipse,然后才可以看 我不清楚这是怎么回事. 另外附上一个外国朋友些的源码.跟LZ的思想是一样的..再次非常感谢!

Screenshot-Tutorial.zip

15.53 KB, 下载次数: 1173

点评

详情 回复 David_Zhang  发表于 2012-2-23 16:12:42

,应该不还eclipse的问题
版主 5# David_Zhang 发表于 2012-2-23 16:12:42
zl56773282 发表于 2012-2-23 11:42
多谢 LZ 我终于懂了...昨天没有理解透..效果做出来了...十分感谢 但是还是有一点 小小的毛病 就是每次截图 ...

,应该不还eclipse的问题
~~阿凡达这部电影告诉我们,谁胯下的鸟大听谁的~~
版主 6# David_Zhang 发表于 2012-2-23 16:13:35
没法预览是什么意思~~
~~阿凡达这部电影告诉我们,谁胯下的鸟大听谁的~~
见习构架师 7# zl56773282 发表于 2012-2-24 09:55:18
David_Zhang 发表于 2012-2-23 16:13
没法预览是什么意思~~

就是说 当你截图成功以后,把图片从eclipse导出来,点击图片 是不能看的没有任何图像,只有把eclipse关闭 才可以打开该图片

点评

详情 回复 David_Zhang  发表于 2012-2-24 10:49:46

不会吧~~不可思议~~
版主 8# David_Zhang 发表于 2012-2-24 10:49:46
zl56773282 发表于 2012-2-24 09:55
就是说 当你截图成功以后,把图片从eclipse导出来,点击图片 是不能看的没有任何图像,只有把eclipse关闭 才 ...

不会吧~~不可思议~~
~~阿凡达这部电影告诉我们,谁胯下的鸟大听谁的~~
您需要登录后才可以回帖 登录 | 注册

关于我们|手机版|Archiver|DEVDIV.COM ( 京ICP备07040843号 )  

GMT+8, 2012-5-19 16:44

Powered by DEVDIV.COM!

© 2010-2012 DEVDIV.COM Coummunity.

回顶部