设为首页 加入收藏

TOP

Android中截图(surfaceView)源码(一)
2014-11-24 11:50:10 来源: 作者: 【 】 浏览:0
Tags:Android 截图 surfaceView 源码

我截图出现黑屏的原因是在Activity中用到了SurfaceView控件,在XML布局中的控件可以完整的显示出来但是有surfaceView的时候就出现黑屏了。具体原因我想的是因为在surfaceView中用线程不停的绘图,操作太频繁了,原来那种方法没有办法截出来。在surfaceView中绘图的原理:


用另外一个Canvas对象不停的把要画到surfaceView中的对象画到这个额外的canvas中,再声明一个Bitmap bitmap对象,注意这个bitmap不是你画在surfaceView中的对象,而是你的目标对象,就是需要截的图。你只需要这样:Canvas canvas=new Canvas(bitmap),接着用canvas.drawBitmap(curBitmap, 0, 0, null),你就可以把当前的的要画的到SurfaceView保存到bitmap中,然后把bitmap保存出来就可以了。PS:这只是截出来SurfaceView中图像,如果想截取背景图片,可以把surfaceView设置为透明。网上有很多种方法,这里就不介绍了。


贴出网上可以运行的代码:


menu.xml:


< xml version="1.0" encoding="utf-8" >




Element.java


import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;


public class Element {
private float mX;
private float mY;


private Bitmap mBitmap;


public Element(Resources res, int x, int y) {
mBitmap = BitmapFactory.decodeStream(new BufferedInputStream(res.openRawResource(R.drawable.icon)));
mX = x - mBitmap.getWidth() / 2;
mY = y - mBitmap.getHeight() / 2;
}


public void doDraw(Canvas canvas) {
canvas.drawBitmap(mBitmap, mX, mY, null);
}
}


Panel.java


import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;


import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.os.Environment;
import android.util.Log;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;


public class Panel extends SurfaceView implements SurfaceHolder.Callback
{


public static float mWidth;
public static float mHeight;


private ViewThread mThread;
private ArrayList mElements = new ArrayList();
private int mElementNumber = 0;


private Paint mPaint = new Paint();
private String mScreenshotPath = Environment.getExternalStorageDirectory()
+ "/droidnova";


public Panel(Context context)
{
super(context);
getHolder().addCallback(this);
mThread = new ViewThread(this);
mPaint.setColor(Color.WHITE);
}



@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height)
{
mWidth = width;
mHeight = height;
}


@Override
public void surfaceCreated(SurfaceHolder holder)
{
if (!mThread.isAlive())
{
mThread = new ViewThread(this);
mThread.setRunning(true);
mThread.start();
}
}


@Override
public void surfaceDestroyed(SurfaceHolder holder)
{
if (mThread.isAlive())
{
mThread.setRunning(false);
}
}


@Override
public boolean onTouchEvent(MotionEvent event)
{
synchronized (mElements)
{
mElements.add(new Element(getResources(), (int) event.getX(),
(int) event.getY()));
mElementNumber = mElements.size();
}
return super.onTouchEvent(event);
}


/**
* If called, creates a screenshot and saves it as a JPG in the folder
* "droidnova" on the sdcard.
*/
//在surfaceView上不停的绘图
public void doDraw(long elapsed, Canvas canvas)
{
canvas.drawColor(Color.BLACK);
synchronized (mElements)
{
for (Element element : mElements)
{
element.doDraw(canvas);
}
}
canvas.drawText("FPS: " + Math.round(1000f / elapsed) + " Elements: "
+ mElementNumber, 10, 10, mPaint);
}
public void saveScreenshot()
{
if (ensureSDCardAccess())

首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇《俄罗斯方块游戏》项目实作【附.. 下一篇bash基础编程总结

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·About - Redis (2025-12-26 08:20:56)
·Redis: A Comprehens (2025-12-26 08:20:53)
·Redis - The Real-ti (2025-12-26 08:20:50)
·Bash 脚本教程——Li (2025-12-26 07:53:35)
·实战篇!Linux shell (2025-12-26 07:53:32)