android linux截图库,Android中截图(surfaceView)源码

总结了一个方法,实现了在Android当前Activity的截图,本人测试确实通过了,不过有朋友说截出来的图是黑色的,不能看。我心想,这没有问题啊,相同的代码我就可以执行通过,并没有没有在意这个问题。可是,今天我再调用那个方法时,截出来的图部分是黑屏。我当时就郁闷了。网上的东西很全,但同时很乱。有一个大神用的是引用Linux下编译出来的库,又用到什么JNI我完全不懂,貌似可以实现截屏。当时这个方法太麻烦,我看了一下觉得没有信心,就又继续寻找其他的方法。

我截图出现黑屏的原因是在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:

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())

{

Bitmap bitmap = Bitmap.createBitmap(getWidth(), getHeight(),

Bitmap.Config.ARGB_8888);

Canvas canvas = new Canvas(bitmap);

//在surfaceView上不停的绘图

doDraw(1, canvas);

File file = new File(mScreenshotPath + "/"

+ System.currentTimeMillis() + ".jpg");

FileOutputStream fos;

try

{

fos = new FileOutputStream(file);

bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos);

fos.close();

}

catch (FileNotFoundException e)

{

Log.e("Panel", "FileNotFoundException", e);

}

catch (IOException e)

{

Log.e("Panel", "IOEception", e);

}

}

}

/**

* Helper method to ensure that the given path exists. TODO: check external

* storage state

*/

private boolean ensureSDCardAccess()

{

File file = new File(mScreenshotPath);

if (file.exists())

{

return true;

}

else if (file.mkdirs())

{

return true;

}

return false;

}

}

ScreenshotActivity.java

import android.app.Activity;

import android.os.Bundle;

import android.view.Menu;

import android.view.MenuInflater;

import android.view.MenuItem;

import android.view.Window;

public class ScreenshotActivity extends Activity {

private Panel mPanel;

/** Called when the activity is first created. */

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

requestWindowFeature(Window.FEATURE_NO_TITLE);

mPanel = new Panel(this);

setContentView(mPanel);

}

@Override

public boolean onCreateOptionsMenu(Menu menu) {

MenuInflater inflater = getMenuInflater();

inflater.inflate(R.menu.menu, menu);

return true;

}

@Override

public boolean onOptionsItemSelected(MenuItem item) {

switch (item.getItemId()) {

case R.id.screenshot:

mPanel.saveScreenshot();

break;

}

return true;

}

}

ViewThread.java

import android.graphics.Canvas;

import android.view.SurfaceHolder;

public class ViewThread extends Thread {

private Panel mPanel;

private SurfaceHolder mHolder;

private boolean mRun = false;

private long mStartTime;

private long mElapsed;

public ViewThread(Panel panel) {

mPanel = panel;

mHolder = mPanel.getHolder();

}

public void setRunning(boolean run) {

mRun = run;

}

@Override

public void run() {

Canvas canvas = null;

mStartTime = System.currentTimeMillis();

while (mRun) {

canvas = mHolder.lockCanvas();

if (canvas != null) {

mPanel.doDraw(mElapsed, canvas);

mElapsed = System.currentTimeMillis() - mStartTime;

mHolder.unlockCanvasAndPost(canvas);

}

mStartTime = System.currentTimeMillis();

}

}

}

其实这很好理解。由于我的代码写在整个项目中,跌出来比较麻烦,就贴了一个以可以完整通过的工程。

下载地址:

下载在Linux公社的1号FTP服务器里,下载地址:

用户名:www.linuxidc.com

密码:www.muu.cc

在 2012年LinuxIDC.com\7月\Android中截图(surfaceView)源码

关于截屏,暂时我的需求已经满足了,不知道这符合其他情况么?欢迎有兴趣的人一起交流。0b1331709591d260c1c78e86d0c51c18.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/365219.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

xmta温度控制仪说明书_XMT系列数显温度控制器使用说明书

测温元件名称分度号测温范围℃分辩率热电偶镍铬—铜镍E(EA—2)0 - 300、0 - 400、0 - 6001℃镍铬—镍硅K(EU—2)0-400、0-600、0-800、0-1300铂铑—铂S(LB—3)0 - 1600、700 - 1600热电阻铜电阻Cu50(G)-50-150、0-50、0-100、0-1500.1℃铂电阻Pt100(BA1、BA2)-199 - 199、0 - 1…

WARNING: 'aclocal-1.14' is missing on your system.

源码安装zabbix agent时进行到make install时报如下错误: WARNING: aclocal-1.14 is missing on your system.You should only need it if you modified acinclude.m4 orconfigure.ac or m4 files included by configure.ac.The aclocal program is part of the GNU…

23套新鲜出炉的网站和手机界面 PSD 素材

Web 用户界面,移动用户界面和线框套件对设计师很有用,因为这些套件让他们使用快速和有效的方式复制用户界面。这些类型的工具包提供了一个基本的用户界面元素,用于它们需要制作的网站或软件模型。 在这篇文章中,我们展示的是自由和…

arcgis栅格邻域统计_ArcGIS 从基础到实战书正式出版,易智瑞技术总裁沙志友沙总推荐并亲自写序...

《ArcGIS 从基础到实战》书正式出版,易智瑞技术总裁沙志友沙总推荐并亲自写序,京东地址 https://item.jd.com/10025512034581.html第一章 ArcGIS基础和入门 11.1 ArcGIS 10.7 Desktop的安装 11.1.1 安装环境 11.1.2 安装步骤 21.1.3 注意的问…

date简述

Date 定义时间和日期的类 java.util.Date 1s1000ms; 时间的原点:公元1970年1月1日 00点00分00秒; public class DateDemo {public static void main(String[] args) {fun();}private static void fun() {Date dnew Date(0);System.out.println(d)…

WebLogic Classloader分析工具

WebLogic Server具有一个名为Classloader Analysis Tool的内置Web应用程序,您可以通过http:// localhost:7001 / wls-cat访问它 您需要使用为/ console Webapp配置的同一用户登录。 使用CAT,您可以检查应用程序在服务器中加载了哪…

python3 计算rsa私钥 已知n e计算d

# 分解模数n def rsa_moder(n):base 2while base < n:if n % base 0:return base, n // basebase 1# 求欧拉函数f(n) def rsa_get_euler(prime1, prime2):return (prime1 - 1) * (prime2 - 1)# 求私钥 def rsa_get_key(e, euler):k 1while True:if (((euler * k) 1) % …

linux算法平台,Linux实时调度算法与测试平台的研究与实现

摘要&#xff1a;实时系统在过去几年里迅速成长,但能够提供实时功能的操作系统往往价格极为昂贵.由于Linux代码公开,且性能优异,使其成为实时操作系统领域里的新宠.然而Linux本身作为一个通用的分时操作系统,将它应用于实时环境有许多缺点和不足,所以要对现有的Linux进行实时化…

Maplace.js – 小巧实用的 jQuery 谷歌地图插件

Maplace.js是一个小的显示谷歌地图的 jQuery 插件&#xff0c;帮助你把谷歌地图嵌入到你的网站&#xff0c;快速在地图位置上创建标记和控制菜单。它需要 jQuery 和谷歌地图 API v3 支持&#xff0c;所以这两个都需要引入到你的页面。它支持标记和自定义图标、缩放级别和自定义…

vue.js根据数据循环生成表格_vue.js循环for(列表渲染)详解

vue.js循环for(列表渲染)详解一、总结一句话总结&#xff1a;v-for{{ item.message }}var example1 new Vue({el: #example-1,data: {items: [{ message: Foo },{ message: Bar }]}})1、vue.js中的循环结构(列表渲染:for)如何使用&#xff1f;v-for用于循环的数组里面的值可以…

使用Spring Roo进行概念验证

在Keyhole期间&#xff0c;我参与了许多项目&#xff0c;其中客户要求我们重写旧系统&#xff0c;同时保留其现有数据库。 有时&#xff0c;它有助于快速演示如何使用当前技术来简化开发&#xff0c;测试和维护其代码。 我发现可以创建一个快速示例&#xff08;与当前项目相关…

z490 linux raid,华硕z490主板装win7系统及bios设置教程(支持10代usb驱动)

[文章导读]我们在组装电脑时&#xff0c;华硕主板可能是大家的首选&#xff0c;最近有网友问&#xff0c;我组装的华硕z490主板电脑怎么装win7系统呢&#xff0c;这里和大家说下&#xff0c;从华硕z490主板后默认是uefigpt引导模式&#xff0c;且官方没有出usb驱动&#xff0c;…

Ember Charts – 基于 Ember D3 的图表库

Ember Charts 是一个基于 Ember.js 和 D3.js 的图表库。它包括时间序列、柱状图、饼图、点图&#xff0c;很容易扩展和修改。这些图表组件代表图表交互性和演示的最佳实践&#xff0c;是高度可定制和可扩展的。您可以添加说明、标签、提示和鼠标悬停效果。 您可能感兴趣的相关文…

swagger内部类_API管理工具Swagger介绍及Springfox原理分析

swagger是一个API框架&#xff0c;号称世界上最流行的API工具。它提供了API管理的全套解决方案&#xff0c;比如API在线编辑器&#xff0c;API UI展示界面&#xff0c;代码生成器等诸多功能。如果想引入swagger进行API管理。目前 springfox 是一个很好的选择&#xff0c;它内部…

[leetcode-108,109] 将有序数组转换为二叉搜索树

109. 有序链表转换二叉搜索树 Given a singly linked list where elements are sorted in ascending order, convert it to a height balanced BST. 给定一个单链表&#xff0c;其中的元素按升序排序&#xff0c;将其转换为高度平衡的二叉搜索树。 本题中&#xff0c;一个高度平…

c语言大数相加怎么写,大数相加

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼#include #include /**** 定义双向节点* 数据区为一个整型数字***/struct Node {int number;//数据区&#xff0c;仅一个数字&#xff0c;保存一位数字struct Node * next;struct Node * prev;};typedef struct Node Node;/*** 创建…

苹果深度学习核心“神经引擎”方向性介绍

https://www.chiphell.com/thread-1785739-1-1.html转载于:https://www.cnblogs.com/eustoma/p/9858410.html

骆驼中的事件处理

在上一篇有关骆驼-小水车的帖子中&#xff0c;我介绍了骆驼-小水车的组件&#xff0c;并使用骆驼路线中的规则实现了一些简单的面向任务的过程。 今天&#xff0c;我将展示如何通过添加事件处理来扩展此示例。 那么如何描述一个事件呢&#xff1f; 每个事件在某个时间发生并持…

值得拥有!精心推荐几款超实用的 CSS 开发工具

当你开发一个网站或 Web 应用程序的时候&#xff0c;有合适的工具&#xff0c;绝对可以帮助您节省大量的时间。在这篇文章中&#xff0c;我为大家收集了超有用的 CSS 开发工具。 对于 Web 开发人员来说&#xff0c;找到有用的 CSS 开发工具&#xff0c;就像找到一个魔灯&#x…

matplotlib散点图笔记

定义: 由一组不连续的点完成的图形 散点图: 包含正相关性,负相关性和不相关性. 散点图生成函数: plt.scatter(x,y) 演示代码如下: import numpy as np import matplotlib.pyplot as plt open,closenp.loadtxt(‘000001.txt’,delimiter’,’,skiprows1,usecols(1,4),unpackTrue…