2011-04-04 22 views
2

好吧,這聽起來可能很愚蠢,但我一直在敲打我的頭對着鍵盤一段時間,現在試圖找出爲什麼這不會刷新。基礎知識:我有一個小樣本應用程序,我正在測試以查看是否可以將某個圖像圍繞某個點的X度數旋轉,並一次顯示一個度數以製作平滑的動畫。所以我有一個很棒的示例,我發現它非常適合滑動條,基本上將圖像旋轉設置爲滑動條上的一個點,太棒了!但是......當我嘗試創建一個隨機數循環,並使用我的變量更新圖像沿途的每一個程度......它什麼也沒有......我得到的是最後更新的圖像...但是當我拖動我的手指在他的滑動條上時,圖形隨着我旋轉而立即更新......我無法弄清楚我在這裏做錯了什麼......這裏是滑塊的代碼...我不知道沒有我的作品創建隨機數並繪製它,但基本上我做了它後面的一個按鈕點擊view.invalidate()不工作,重繪圖像

本質上,如果你看看這一塊,我做了同樣的按鈕後面,但它不做「實時」 。我叫view.invalidate()和view.postinvalidate(),試圖迫使它,但沒有去...

@Override 
    public void onProgressChanged(SeekBar seekBar, int progress, 
    boolean fromUser) { 
    // TODO Auto-generated method stub 
    curRotate = (float)progress; 
    drawMatrix(); 
    } 

private void drawMatrix(){ 

    Matrix matrix = new Matrix(); 
     matrix.postScale(curScale, curScale); 
     matrix.postRotate(curRotate); 

     Bitmap resizedBitmap = Bitmap.createBitmap(bitmap, 0, 0, bmpWidth, bmpHeight, matrix, true); 
     myImageView.setImageBitmap(resizedBitmap); 

    } 

回答

0

聽起來像您阻止與您的代碼,以旋轉圖像的UI線程。

我現在還沒有任何代碼顯示你(回覆和當我今晚在家時,我可以發佈應該幫助的東西),但yuo可能會得到更好的結果,將您的旋轉代碼置於AsyncTask,請參閱dev站點的Painless Threading區域以獲取更多信息。

+0

謝謝!我將檢查線程......即使在我習慣於c#的世界中也是一件常見的事情,但是在那個世界中,我仍然可以導致主UI線程的強制重繪(它不是最優的),但是在小尺度下它仍然可以工作就好了......嗯,看看我是否可以脫離一個線程,然後通過線程安全活動更新UI。謝謝! – noobS41bot 2011-04-04 16:22:55

+0

或者,您可以在UI線程中使用更容易創建和使用的「Runnable」,並且還可以讓它更新您的UI。 – RivieraKid 2011-04-04 20:02:17

+0

真棒謝謝你。我將嘗試脫掉一個可以完成工作並自行結束的線程。我會看看我今晚能否做到這一點。希望它能殺死自己大聲笑。 – noobS41bot 2011-04-04 20:52:51

1

我認爲你所做的是一樣的東西:

for (int degrees = 0 ; degrees < maxRotation ; i++) { 
    // perform the rotation by matrix 
    myImageView.invalidate(); 
} 

這是行不通的,因爲只有invalidate()安排在主線程事件隊列重繪。這意味着只有在當前代碼全部執行完成的情況下才執行重繪(在這種情況下爲for循環)。

對於簡單的旋轉,Tween Animation會更合適。對於更高級的內容(比如遊戲動畫),您可能需要創建自定義視圖或使用SurfaceView

+0

我看了一下補間動畫,但我不認爲我試圖將「太旋轉」設置爲360以上的任何東西......也許我可以嘗試這樣做,它可能適合我的需求......謝謝! – noobS41bot 2011-04-04 16:20:31

0

我有同樣的問題,我用:

runOnUiThread(new Runnable() { 
    public void run() { 
    myImageView.setImageBitmap(image); 
    imageView.invalidate(); 
    } 
});