【问题标题】:How can I make my image animation smoother?如何使我的图像动画更流畅?
【发布时间】:2013-01-03 19:53:48
【问题描述】:

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

我只是通过翻译图像来实现这一点,然后等待Thread.sleep(panoanimspeed);(其中 1/1000s

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

【问题讨论】:

    标签: android animation android-asynctask panoramas


    【解决方案1】:

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

    【讨论】:

    • 我尝试的第一件事是动画,我认为这将是一件非常容易的事情。问题在于,当您为不适合视图的图像(如全景图)设置动画时,动画仅移动可见的图像部分。换句话说,图像像素被黑色像素代替,而不是图像的像素。希望我说清楚了......
    【解决方案2】:

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

    在第一个周期,将系统时间保存为基准时间戳。

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

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

    【讨论】:

    • 好主意...会考虑这个。谢谢!
    • 不幸的是,您的想法没有“完全”奏效。由于我的Thread.sleep 很小(6 到 8 毫秒可以很好地滚动),因此有时循环需要的时间比这长得多。然后暗示连续几个Thread.sleep(0),图像跳转。但是,我可以多次看到睡眠值得到很好的补偿。应该有一种获得“优先权”的方法。或者考虑到屏幕外图像的标准动画功能(这将是完美的)。
    • 问题是Thread.sleep() 对我的需求来说太不准确了。我的睡眠需要大约 5 毫秒,而 Thread.sleep() 可能与 50 或 100 毫秒一样不准确,这与您在此处报告的延迟相吻合:stackoverflow.com/questions/7340302/…wait() 也发生了同样的问题。所以我最终做的是一个简单的future = System.currentTimeMillis() + something; while (System.currentTimeMillis() &lt; future) {//empty loop}。这当然是 CPU 密集型的,但至少它现在运行得相当顺利。
    猜你喜欢
    • 1970-01-01
    • 2012-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多