Android 获取工作线程中滚动视图的屏幕截图
我需要一个ScrollView的屏幕截图。我的代码如下:Android 获取工作线程中滚动视图的屏幕截图,android,multithreading,screenshot,android-scrollview,Android,Multithreading,Screenshot,Android Scrollview,我需要一个ScrollView的屏幕截图。我的代码如下: private File getScreenShot() { final int count = mScrollView.getChildCount(); int height = 0; for (int i = 0; i < count; i++) { View view = mScrollView.getChildAt(i); height += view.getHeigh
private File getScreenShot() {
final int count = mScrollView.getChildCount();
int height = 0;
for (int i = 0; i < count; i++) {
View view = mScrollView.getChildAt(i);
height += view.getHeight();
}
// get screen shot bitmap
Bitmap bitmap = Bitmap.createBitmap(mScrollView.getWidth(), height,
Bitmap.Config.RGB_565);
final Canvas canvas = new Canvas(bitmap);
mScrollView.draw(canvas);
// save to a temp file
return saveToFile(bitmap);
}
但有趣的是:我尝试使用Thread
和AsyncTask
的子类。他们每个人都能在大部分时间内完成这项工作。但是,过几次会引发异常并导致应用程序崩溃:
android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
但是如何在大多数时间内成功运行代码?我的意思是,如果我能得到这个异常,我确实做了一些错误的事情(调用View.draw(Canvas)
在主线程之外)。第一次或第二次运行代码时不会发生故障,而第三次可能会发生故障。我试图滚动ScrollView
并在滚动停止之前调用该方法,这可能会导致崩溃。但如果我第一次做同样的事情,崩溃也不会发生
我输出线程,它属于主组->[线程XXXXX,5,主]
我不知道为什么会出现这种奇怪的结果?有人能告诉我原因吗?如何在另一个线程中获取
滚动视图的屏幕截图?我不会尝试从另一个线程获取屏幕截图。我会从主线程获取屏幕截图,并将其保存到另一个线程的磁盘上
您是否尝试过图形缓存
mScrollView.setDrawingCacheEnabled(true);
Bitmap bitmap = Bitmap.createBitmap(mScrollView.getDrawingCache());
mScrollView.setDrawingCacheEnabled(false);
如果它不能提高性能,我会截取mScrollView子线程的屏幕快照,并将它们组装到另一个线程上的一个位图中。它将允许您在子级之间生成UI线程。绘图缓存是无用的,它将为scrollview创建一个空位图。对不起,您是对的。还刚刚验证了一个旧项目,canvas也是我这样做的。没有任何问题,所以我假设您的屏幕上加载了视图:)。我还是喜欢孩子们而不是滚动视图
mScrollView.setDrawingCacheEnabled(true);
Bitmap bitmap = Bitmap.createBitmap(mScrollView.getDrawingCache());
mScrollView.setDrawingCacheEnabled(false);