我需要获取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.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);
}
因为我的mScrollView
太长了以至于某些内容将被隐藏,直到用户向下滚动,它会花费很多时间捕获屏幕截图(接近100毫秒)并暂时停止UI线程。所以我决定在另一个线程中运行该方法。代码喜欢:
new Thread() {
@Override
public void run() {
System.out.println(Thread.currentThread());
mShareFile = getScreenShot();
mHandler.sendEmptyMessage(96);
}
}.start();
但有趣的是:我尝试使用Thread
和AsyncTask
的子类。他们每个人都可以在大多数时间里完成这项工作。但是,有几次会抛出异常并导致应用程序崩溃:
android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
但是我怎样才能在大多数时间内成功运行代码?我的意思是,如果我能得到这个例外,我确实做错了什么(在主线程之外调用View.draw(Canvas)
)。第一次或第二次运行代码时,失败不会发生,而第三次可能会发生。我试图滚动ScrollView
并在滚动停止之前调用方法,这可能会导致崩溃。但如果我第一次做同样的事情,碰撞也不会发生。
我输出线程,它属于主要组 - &gt; [主题XXXXX,5,主要]
我不知道为什么会发生这种奇怪的结果?有人可以告诉我原因吗?如何在另一个帖子中获取ScrollView
的屏幕截图?
答案 0 :(得分:0)
我不会尝试从另一个线程截取屏幕截图。我会从主线程中截取屏幕截图并将其保存到另一个线程的磁盘上。
您是否尝试过绘图缓存?
@JsonIgnoreProperties({ "createdDate", "lastModifiedDate" })
如果它没有提高性能,我会截取mScrollView子代的截图,并将它们组装成另一个线程上的一个位图。它允许你在子节点之间产生UI线程。