5

iPhoneのナビゲーションのように前後にアニメーション化しようとしているFlowPanelがあります。(これを行う方法に関する私の最初の質問については、この投稿を参照してください)

だから私はそれを以下に示すコードで「動作」させています。スクローラーの最終的な位置が正確ではなく、スクロールすると常に変化することがわかったため、引用符で囲んで作業していると言います。

GWT.logは常に私が探している実際の値を示しているので、たとえば以下のscrollToの呼び出しでは、私のGWT.logは次のように述べています。

ScrollStart:0 scrollStop:-246

しかし、実際にfireBugの要素、そのcssを分析すると、左の位置が正確に-246pxになることはありません。時々それは10pxもずれているので、私のパネルは終了する前にスクロールを停止しました。

最悪の部分は、このナビゲーションが前後にアニメーション化することです。そのため、後続のクリックで実際にそれが外れる可能性があります。ピクセルの完全な配置が必要です。そうしないと、全体が見えなくなります。

すでに行ったこと以外に、これをデバッグするためにどこから始めればよいのかさえわかりません。ヒントをいただければ幸いです。

編集:追加のロギング情報:
onUpdate内のロギングはこれを示しています:

Updating: progress: 0.09319577524960648 position: -22.926160711403195
Updating: progress: 0.1328387452821571 position: -32.67833133941065
Updating: progress: 0.609071620698271 position: -149.83161869177468
Updating: progress: 0.7269952498697734 position: -178.84083146796425
Updating: progress: 0.9852532367342712 position: -242.37229623663072
AnimationComplete: final scrollStart/scrollStop: 0/-246

なぜそれは0.98%で終わるのですか?

アニメーションを呼び出すコード

scroller = new Scroller();
scroller.scrollTo(-246,400);

アニメーションコード

public class Scroller extends Animation {

    private FlowPanel scroller;
    private final Element e;

    public Scroller(){
        scroller = new FlowPanel();
        e = scroller.getElement();
    }

    public void scrollTo(int position, int milliseconds) {

        scrollStart = e.getOffsetLeft();
        scrollStop = position;

        GWT.log("ScrollStart: " + scrollStart + " scrollStop: " + scrollStop);
        run(milliseconds);
    }

    @Override
    protected void onUpdate(double progress) {
        double position = scrollStart + (progress * (scrollStop - scrollStart));
        e.getStyle().setLeft(position, Style.Unit.PX);
    }
}
4

1 に答える 1

7

onCompleteアニメーションが終了したときに呼び出されます(onStart開始する前に呼び出されます)。したがって、アニメーションが100%完了したときにアクションを実行する場合は、次のようにオーバーライドします。

public class Scroller extends Animation {
      ...

      @Override
      protected void onComplete() {
        e.getStyle().setLeft(scrollStop, Style.Unit.PX);
      }
}

編集ブラッドノートとして、ドキュメントは、アニメーションが終了したときにonCompleteが呼び出されるものであることをあまり明確にしていません。Javadocによると、Animation.onUpdateは次のとおりです。

アニメーションを更新する必要があるときに呼び出されます。progressの値は、0.0から1.0までです(interpolate(double)メソッドをオーバーライドして、より広い範囲の値を提供する場合を除く)。onStart()およびonComplete()をオーバーライドして、セットアップおよびティアダウン手順を実行できます。

これらのメソッドを呼び出すコードは、アニメーションが開始されたがまだ終了していない場合、つまり進行値が0より大きいが1未満の場合にのみonUpdateが呼び出されることを明確にする唯一のものです。

于 2010-04-19T18:51:28.850 に答える