2013-01-03 55 views
2

我做了一個自動滾動圖像的全景圖應用程序,從左到右依次類推。它很好地工作,除了它並不像我想的那樣平滑(意味着恆定的速度)。它有時會「跳躍」一點。它不應該是在1.4千兆赫的核心設備...如何讓我的圖像動畫更流暢?

我實現這只是通過平移的圖像,然後等待位與Thread.sleep(panoanimspeed);(其中,1/1000秒< = panoanimspeed < = 1/50年代), 等等。可能不是最聰明的事情......?

你知道我該如何使這個更平滑?以下是相關AsyncTask的代碼。

謝謝!

class AnimatePanorama extends AsyncTask<Void, Integer, Void> { 
    private float scale = foto.getCropScale() * foto.getBaseScale(); 
    private Matrix m = foto.matrix; 
    @Override 
    protected void onProgressUpdate(Integer... values) { 
     if (values[0] == 0) { 
      m.setScale(scale, scale); 
      m.postTranslate(values[1], 0); 
      foto.setImageMatrix(m); 
     } 
    } 
    @Override 
    protected Void doInBackground(Void... arg) { 
     dir = -dir; 
     int l, ini = 0; 
     float lim = foto.getImageWidth()*scale - foto.getViewWidth(); 
     float[] mm = new float[9]; 
     foto.matrix.getValues(mm); 
     if (foto.getScale() == foto.getCropScale()) 
       ini = (int) (dir*(lim*(dir+1)/2 + mm[2])); 

     while (true) { 
      if(isCancelled()) break; 
      l = (int) (lim*(dir+1)/2); 
      for (int i = ini; i < lim; i++) { 
       if(isCancelled()) break; 
       try { 
        Thread.sleep(panoanimspeed); 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 
       publishProgress(0, dir * i - l); 
      } 
      ini = 0; 
      dir = -dir; 
     } 
     return null; 
    } 
} 

回答

0

通過擴展動畫類(http://developer.android.com/reference/android/view/animation/Animation.html) 創建動畫和重寫applyTransformation(float interpolatedTime, Transformation t)方法。

+0

我嘗試的第一件事是動畫,我認爲這將是一件非常簡單的事情。問題在於,當您爲不適合視圖的圖像(如全景圖)製作動畫時,動畫只會移動圖像中可見的部分。換句話說,圖像像素被黑色像素替代,而不是圖像的像素。希望我自己清楚... –

0

將您的圖像翻譯基於「實時」翻譯,例如每秒X像素。

在第一個週期中,將系統時間保存爲基準時間戳。

在將來的循環週期中,根據自基準時間戳以來的時間計算新位置。

這將避免Thread.sleep「真實世界」時間的不可靠性。

+0

不錯的想法...會想想這個。謝謝! –

+0

不幸的是,你的想法並沒有「完全」工作。由於我的'Thread.sleep'很小(6到8毫秒給出了一個很好的滾動),有時循環需要比這更長的時間。然後在一行中隱含幾個'Thread.sleep(0)',並且圖像跳轉。但是,我可以看到很多次睡眠值得到了很好的補償。應該有一種獲得「優先」的方式。或者是一個標準的動畫功能,將屏幕上的圖像考慮在內(這將是完美的)。 –

+0

問題是Thread.sleep()對我的需求太不準確了。我的睡眠需要大約5毫秒,而'Thread.sleep()'可能與50或100毫秒一樣不準確,這與您在此處報告的延遲時間一致:http://stackoverflow.com/questions/7340302/how-to-減少線程睡眠延遲在Android。 'wait()'發生了同樣的問題。所以我最終做的是一個簡單的'future = System.currentTimeMillis()+的東西; while(System.currentTimeMillis()