web-dev-qa-db-ja.com

Android:グラフィック要素を再描画する方法は?

Viewを拡張するRoundIconクラスを作成しました。このクラスにはsetIconImage()メソッドが含まれています。

public void setIconImage(int imageFromResources) {
    iconImage = BitmapFactory.decodeResource(getResources(), imageFromResources);
    iconWidth = iconImage.getWidth();
    iconHeight = iconImage.getHeight();
    refreshDrawableState();
}

そしてonDraw()メソッドがあります:

@Override
protected void onDraw(Canvas canvas) {

    if(px == 0 || py == 0)
    {
        px = 50;
        py = 50;
    }


    canvas.drawCircle(px, py, circleRadius, circlePaint);
    canvas.save();

    if(iconImage != null)
    {
        int cardinalX = px - iconWidth/2;
        int cardinalY = py - iconHeight/2;
        canvas.drawBitmap(iconImage, cardinalX, cardinalY, iconPaint);
    }

    canvas.restore();
}

問題は、メインアクティビティからメソッドsetIconImage()が呼び出されるたびに関数onDraw()が実行されないため、ユーザーインターフェイスでアイコンが変更されないことです。

SetIconImageメソッドが呼び出されるたびに画像を再描画するためにコードを変更する方法を知っている人はいますか?

17
Niko Gamulin

View.refreshDrawableState() の代わりに View.invalidate() を呼び出してみてください

Invalidateは、ビューのより小さな領域のみを更新してパフォーマンスを向上させるためにinvalidate(Rect)オーバーロードを更新する場合、ビュー内のすべてのピクセルを再描画する必要があることをビューに通知します。

44
snctln

必ずrefreshDrawableState()の代わりにinvalidateを呼び出してください。バックグラウンドコールでpostInvalidate()を呼び出しているかどうかを確認することをお勧めします。

7
hacken