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メソッドが呼び出されるたびに画像を再描画するためにコードを変更する方法を知っている人はいますか?
View.refreshDrawableState() の代わりに View.invalidate() を呼び出してみてください
Invalidateは、ビューのより小さな領域のみを更新してパフォーマンスを向上させるためにinvalidate(Rect)オーバーロードを更新する場合、ビュー内のすべてのピクセルを再描画する必要があることをビューに通知します。
必ずrefreshDrawableState()の代わりにinvalidateを呼び出してください。バックグラウンドコールでpostInvalidate()を呼び出しているかどうかを確認することをお勧めします。