2013-01-03 54 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()