2

クラスにDrawableを実装しています。「まばたき」効果を得るには、定期的に再描画する必要があります。timer.schedule を使用して invalidateSelf() をスケジュールしていますが、何も起こりませんでした。

private class DrawableImpl extends Drawable {
    private boolean blinkFlag = false;
    private Timer timer = new Timer(false);

    private int maxFlashCount = 21;
    private int intervalBetweenFlashesInMs = 100;
    private int currentFlashNumber = 0;

    @Override
    public void draw(Canvas canvas) {
        Log.i(TAG, "draw");

        /*draw stable part*/

        if (blinkFlag ) {
            Log.i(TAG, "blink");
            /*draw bliking part*/
        }

        blinkFlag = !blinkFlag;

        final DrawableImpl drawableImpl = this; 
        if (currentFlashNumber < maxFlashCount) {
            Log.i(TAG, "schedule");
            timer.schedule(new TimerTask() {
                @Override
                public void run() {
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            Log.i(TAG, "run from back");
                            drawableImpl.invalidateSelf();
                        }
                    });
                }
            }, intervalBetweenFlashesInMs);
            currentFlashNumber++;
        }
    }
}

ログでは、次のように なり
ます

): スケジュール
02-08 23:07:45.011: INFO/(258): 後ろから実行
02-08 23:07:45.021: INFO/(258): ドロー
02-08 23:07:45.021: INFO/(258 ): スケジュール
02-08 23:07:45.171: INFO/(258): 後ろから実行
02-08 23:07:45.171: INFO/(258): ドロー
02-08 23:07:45.171: INFO/(258 ): まばたき
02-08 23:07:45.171: INFO/(258): スケジュール
02-08 23:07:45.331: INFO/(258): 後ろから走る

なぜうまくいかなかったのですか?そのために別の方法を使用する必要がありますか?

4

1 に答える 1

2

開発者ドキュメントが答えを持っていると思います。

現在のDrawable.Callback実装を使用して、このDrawableを再描画します。Drawableにコールバックがアタッチされていない場合は何もしません。

于 2011-02-09T00:57:28.203 に答える