我需要獲取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.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
並在滾動停止前調用該方法,這可能會導致崩潰。但如果我第一次做同樣的事情,崩潰也不會發生。
I輸出線,它屬於主組 - > [主題XXXXX,5,主]
我不知道爲什麼這個奇怪的結果發生了什麼?有人能告訴我原因嗎?如何在另一個線程中獲取ScrollView
的屏幕截圖?
繪圖緩存沒用,它會爲滾動視圖創建一個空位圖。 – ywwynm
對不起,你是對的。也只是驗證了一箇舊項目和畫布,我也是這麼做的。沒有任何問題困難,所以我假設你的屏幕加載了視圖:)。我仍然會與孩子們一起去,而不是滾動視圖 – user3802077