2016-04-06 25 views
0

我需要獲取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(); 

但一些有趣的事情來了:我試圖用的ThreadAsyncTask一個子類。他們每個人都可以在大多數時間完成這項工作。然而,在幾次的會拋出異常,並導致應用程序崩潰:

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的屏幕截圖?

回答

0

我wouldnt嘗試從另一個線程截圖。我會從主線程截取屏幕截圖並將其保存到另一個線程的磁盤上。

您是否嘗試過繪圖緩存?

mScrollView.setDrawingCacheEnabled(true); 
Bitmap bitmap = Bitmap.createBitmap(mScrollView.getDrawingCache()); 
mScrollView.setDrawingCacheEnabled(false); 

如果不提高性能,我會採取mScrollView的孩子的截圖,並將它們組裝成另一個線程一個位圖。它可以讓你產生孩子之間的UI線程。

+0

繪圖緩存沒用,它會爲滾動視圖創建一個空位圖。 – ywwynm

+0

對不起,你是對的。也只是驗證了一箇舊項目和畫布,我也是這麼做的。沒有任何問題困難,所以我假設你的屏幕加載了視圖:)。我仍然會與孩子們一起去,而不是滾動視圖 – user3802077