-1

私は階層を持っています:

Buttons  (Button childs)
   myView (View child)
      RelativeView (has background image)

myViewで、アニメーション(スケール0.5〜1.0サイズ)のある円を描画します。パフォーマンスが非常に低くなります(描画が非常に遅くなります)。

サーフェスビューはどのビューでも透明にできないため、サーフェスビューを使用できません。透明にする場合は、
透明にする必要があります。 surface.setZOrderOnTop(true);

何をすべきか?

PS

描画コード

    // Square is Button that need to has animated circle under it
for (int i = 0; i < squares.size(); i++) {
        Square square = squares.get(i);
        if (square.animIndex == -1)
            continue;
        int left = square.getLeft();
        int top = getRelativeTop(square);

        int w = (int) (square.animIndex * square.getMeasuredWidth() * 4 / 10f);

        square.animIndex++;

        if (square.animIndex > 10) {
            square.animIndex = -1;
        }
              //note is circle bitmap
        c.drawBitmap(note, null, new Rect(left - w / 2 + square.getMeasuredWidth() / 2, top - w / 2
                + square.getMeasuredHeight() / 2, left - w / 2 + square.getMeasuredWidth() / 2 + w, top
                - w / 2 + square.getMeasuredHeight() / 2 + w), null);
    }
4

1 に答える 1

1

完全なコードを見ないと、ボトルネックの原因を特定するのが難しく、正確に何を描こうとしているのかが質問から明確ではないため、いくつかの指針しかありません。

投稿したコードがonDraw()メソッドである場合、すべての計算をアウトして別のバックグラウンド スレッドに移動することを検討します。onDraw()はメイン (GUI) スレッドで実行されるため、できるだけ計算を行わないようにする必要があります。つまり、ビットマップを画面にダンプする準備ができている必要があり、パラメーターは変数として使用できるようにする必要がありgetMeasuredHeight()ますonDraw()

また、キャストを行っています:

int w = (int) (square.animIndex * square.getMeasuredWidth() * 4 / 10f);

可能であれば、浮動小数点数と整数を混在させることは避けてください。ただし、この計算は onDraw() メソッドから除外してください。

最後に、「onDraw()」はメイン スレッドで実行されるため、スレッドを計算で「独り占め」しないことが不可欠です。アプリが応答しなくなったり遅くなったりするため、ユーザーはアンインストールすることになります。あなたが描こうとしているものにはおそらく何も問題はなく、問題を引き起こしているのはあなたがそれをどのように行っているかです.

于 2012-07-09T14:25:19.747 に答える