相互に描画されたビットマップのレイヤーで構成されるビットマップを作成するために使用するLayeredImageView
拡張クラスがあります。ImageView
私が描いているビットマップはゲームの軍事ユニットであり、ユニットのビットマップの上に重ねたいビットマップの 1 つは彼らの健康です。メソッドでヘルス変数をオンにしてonDraw()
、適切なビットマップを描画します。
私の問題は、onDraw()
メソッドが呼び出されないことです(デバッグメッセージで確認されています)。
LayeredImageViews のアダプターをクラスImageViewAdapter
拡張で保持し、適切な Bitmap 引数を使用しBaseAdapter
てgetView(...)
メソッド呼び出しを行います。imageView.setImageBitmap(mThumbIds[position])
私が理解していることから、これは のinvalidate()
メソッドを呼び出すLayeredImageView
必要があり、次に を呼び出す必要がありますonDraw()
が、私が言ったように、それは起こっていません。
LayeredImageView
クラスのコアは次のとおりです。
public class LayeredImageView extends ImageView{
private static final String TAG = "LayeredImageView";
Context mContext;
int health;
public LayeredImageView(Context context) {
super(context);
mContext = context;
health = 0;
setWillNotDraw(false);
}
public void setHealth(int health){
this.health = health;
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
Bitmap healthIcon = null;
int width;
int height;
int x;
int y;
switch(health){
case 1:
healthIcon = decodeSampledBitmapFromResource(mContext.getResources(),R.drawable.health1, 100, 100);
break;
case 2:
healthIcon = decodeSampledBitmapFromResource(mContext.getResources(),R.drawable.health2, 100, 100);
break;
}
if(healthIcon != null){
width = healthIcon.getWidth();
height = healthIcon.getHeight();
x = canvas.getWidth() - width;
y = canvas.getHeight() - height;
canvas.drawBitmap(healthIcon, x, y, new Paint());
}
}
public static int calculateInSampleSize(BitmapFactory.Options options,
int reqWidth, int reqHeight) {
// Raw height and width of image
final int height = options.outHeight;
final int width = options.outWidth;
int inSampleSize = 1;
if (height > reqHeight || width > reqWidth) {
// Calculate ratios of height and width to requested height and
// width
final int heightRatio = Math.round((float) height
/ (float) reqHeight);
final int widthRatio = Math.round((float) width / (float) reqWidth);
// Choose the smallest ratio as inSampleSize value, this will
// guarantee
// a final image with both dimensions larger than or equal to the
// requested height and width.
inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio;
}
return inSampleSize;
}
public static Bitmap decodeSampledBitmapFromResource(Resources res,
int resId, int reqWidth, int reqHeight) {
// First decode with inJustDecodeBounds=true to check dimensions
final BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeResource(res, resId, options);
// Calculate inSampleSize
options.inSampleSize = calculateInSampleSize(options, reqWidth,
reqHeight);
// Decode bitmap with inSampleSize set
options.inJustDecodeBounds = false;
return BitmapFactory.decodeResource(res, resId, options);
}
}
ご覧のとおり、ここで提案を実装しようとしましたが、うまくいきませんでした。
編集
LayeredImageView
オブジェクトがインスタンス化される場所は次のとおりです。
public View getView(int position, View convertView, ViewGroup parent) {
LayeredImageView imageView;
if (convertView == null) { // if it's not recycled, initialize some attributes
imageView = new LayeredImageView(mContext);
imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
imageView.setPadding(7, 5, 7, 5);
}
else{
imageView = (LayeredImageView) convertView;
}
Piece piece = game.getPiece(position % 10, 9-position/10);
if(piece != null){//here we overlay the health icon if the piece has non-zero health
imageView.setHealth(piece.getHealth());
}
imageView.setImageBitmap(mThumbIds[position]);
return imageView;
}
どんな助けでも大歓迎です。ありがとう!