17

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 が呼び出されるたびに画像を再描画するためにコードを変更する方法を知っている人はいますか?

4

2 に答える 2

44

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

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

于 2009-06-19T13:58:51.123 に答える
7

refreshDrawableState()の代わりにinvalidateを確実に呼び出します。どのスレッドをオンにしているか、バックグラウンドでpostInvalidate()を呼び出しているかどうかを確認することをお勧めします。

于 2009-06-19T18:39:38.853 に答える