糖尿病康复,内容丰富有趣,生活中的好帮手!
糖尿病康复 > android 后台 截屏 Android 截屏方式

android 后台 截屏 Android 截屏方式

时间:2022-03-09 15:33:49

相关推荐

android 后台 截屏 Android 截屏方式

1. 只截取自己应用内部界面

1.1 只截取自己应用内部界面

View dView = getWindow().getDecorView();

dView.setDrawingCacheEnabled(true);

dView.buildDrawingCache();

Bitmap bitmap = Bitmap.createBitmap(dView.getDrawingCache());

if (bitmap != null) {

try {

// 获取内置SD卡路径

String sdCardPath = Environment.getExternalStorageDirectory().getPath();

// 图片文件路径

String filePath = sdCardPath + File.separator + "screenshot.png";

File file = new File(filePath);

FileOutputStream os = new FileOutputStream(file);

press(pressFormat.PNG, 100, os);

os.flush();

os.close();

DebugLog.d("a7888", "存储完成");

} catch (Exception e) {

}

}

1.2 截取某个控件或者区域

两种方案:

跟上面差不多,只不过view不适用根view,而是使用某个某个控件

View dView = title;

dView.setDrawingCacheEnabled(true);

dView.buildDrawingCache();

Bitmap bitmap = Bitmap.createBitmap(dView.getDrawingCache());

手动draw

View dView = titleTv;

Bitmap bitmap = Bitmap.createBitmap(dView.getWidth(), dView.getHeight(), Bitmap.Config.ARGB_8888);

//使用Canvas,调用自定义view控件的onDraw方法,绘制图片

Canvas canvas = new Canvas(bitmap);

dView.draw(canvas);

2. 截取非含当前应用的屏幕部分(最佳官方方案)

Android 在5.0 之后支持了实时录屏的功能。通过实时录屏我们可以拿到截屏的图像。同时可以通过在Service中处理实现后台的录屏。具体的类讲解大家自行网上查阅。

大体步骤:

1.初始化一个MediaProjectionManager

MediaProjectionManager mMediaProjectionManager = (MediaProjectionManager)getApplication().getSystemService(Context.MEDIA_PROJECTION_SERVICE);

2.创建intent,并启动Intent。注意这里是startActivityForResult

startActivityForResult(mMediaProjectionManager.createScreenCaptureIntent(), REQUEST_MEDIA_PROJECTION);

3.在onActivityResult中拿到Mediaprojection

mResultCode = resultCode;

mResultData = data;

mMediaProjection = mMediaProjectionManager.getMediaProjection(mResultCode, mResultData);

4.设置VirtualDisplay 将图像和展示的View关联起来。一般来说我们会将图像展示到SurfaceView,这里为了为了便于拿到截图,我们使用ImageReader,他内置有SurfaceView。

mImageReader = ImageReader.newInstance(windowWidth, windowHeight, 0x1, 2); //ImageFormat.RGB_565

mVirtualDisplay = mMediaProjection.createVirtualDisplay("screen-mirror",

windowWidth, windowHeight, mScreenDensity, DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR,

mImageReader.getSurface(), null, null);

5.通过ImageReader拿到截图

strDate = dateFormat.format(new java.util.Date());

nameImage = pathImage+strDate+".png";

Image image = mImageReader.acquireLatestImage();

int width = image.getWidth();

int height = image.getHeight();

final Image.Plane[] planes = image.getPlanes();

final ByteBuffer buffer = planes[0].getBuffer();

int pixelStride = planes[0].getPixelStride();

int rowStride = planes[0].getRowStride();

int rowPadding = rowStride - pixelStride * width;

Bitmap bitmap = Bitmap.createBitmap(width+rowPadding/pixelStride, height, Bitmap.Config.ARGB_8888);

bitmap.copyPixelsFromBuffer(buffer);

bitmap = Bitmap.createBitmap(bitmap, 0, 0,width, height);

image.close();

6.注意截屏之后要及时关闭VirtualDisplay ,因为VirtualDisplay 是十分消耗内存和电量的。

if (mVirtualDisplay == null) {

return;

}

mVirtualDisplay.release();

mVirtualDisplay = null;

3. 截取长屏

截取长屏其实原理就是截取整个ScrollView或者ListView的视图,因此实现原理跟上面中提到的截取某个控件的View基本一致。

ScrollView 实现截屏

/**

* 截取scrollview的屏幕

* **/

public static Bitmap getScrollViewBitmap(ScrollView scrollView) {

int h = 0;

Bitmap bitmap;

for (int i = 0; i < scrollView.getChildCount(); i++) {

h += scrollView.getChildAt(i).getHeight();

}

// 创建对应大小的bitmap

bitmap = Bitmap.createBitmap(scrollView.getWidth(), h,

Bitmap.Config.ARGB_8888);

final Canvas canvas = new Canvas(bitmap);

scrollView.draw(canvas);

return bitmap;

}

ListView实现截屏

/**

* 截图listview

* **/

public static Bitmap getListViewBitmap(ListView listView,String picpath) {

int h = 0;

Bitmap bitmap;

// 获取listView实际高度

for (int i = 0; i < listView.getChildCount(); i++) {

h += listView.getChildAt(i).getHeight();

}

Log.d(TAG, "实际高度:" + h);

Log.d(TAG, "list 高度:" + listView.getHeight());

// 创建对应大小的bitmap

bitmap = Bitmap.createBitmap(listView.getWidth(), h,

Bitmap.Config.ARGB_8888);

final Canvas canvas = new Canvas(bitmap);

listView.draw(canvas);

return bitmap;

}

WebView实现截屏

//这是webview的,利用了webview的api

private static Bitmap captureWebView(WebView webView) {

Picture snapShot = webView.capturePicture();

Bitmap bmp = Bitmap.createBitmap(snapShot.getWidth(),

snapShot.getHeight(), Bitmap.Config.ARGB_8888);

Canvas canvas = new Canvas(bmp);

snapShot.draw(canvas);

return bmp;

}

4. 实时截屏

可参考2中Android 在5.0的做法,进行实时录制。

如果觉得《android 后台 截屏 Android 截屏方式》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。