2

我制作了一个全景应用程序,可以自动滚动图像,从左到右到左等等。它工作得很好,除了它不像我想要的那样平滑(意味着恒定速度)滚动。它有时会“跳跃”一点。它不应该在核心为 1.4 GHz 的设备中......

我只是通过翻译图像来实现这一点,然后稍等一下Thread.sleep(panoanimspeed);(其中 1/1000s <= panoanimspeed <= 1/50s),依此类推。可能不是最聪明的做法......?

你知道我怎样才能使它更顺畅吗?下面是相关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;
    }
}
4

2 回答 2

0

通过扩展 Animation 类( http://developer.android.com/reference/android/view/animation/Animation.html )创建动画并覆盖该applyTransformation(float interpolatedTime, Transformation t)方法。

于 2013-01-03T20:03:41.713 回答
0

将您的图像翻译基于“实时”的翻译,例如每秒 X 像素。

在第一个循环中,将系统时间保存为基本时间戳。

在未来的循环周期中,根据自基准时间戳以来的时间计算新位置。

这将避免 Thread.sleep “真实世界”时间的不可靠性。

于 2013-01-03T20:03:59.290 回答