2

画像を左から右、左へと自動的にスクロールするパノラマアプリを作成しました。私が望むほどスムーズに(つまり一定の速度で)スクロールしないという事実を除いて、それはうまく機能します。時々「ジャンプ」します。1.4GHzのコアを備えたデバイスには使用しないでください...

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 に答える