0

相互に描画されたビットマップのレイヤーで構成されるビットマップを作成するために使用するLayeredImageView拡張クラスがあります。ImageView私が描いているビットマップはゲームの軍事ユニットであり、ユニットのビットマップの上に重ねたいビットマップの 1 つは彼らの健康です。メソッドでヘルス変数をオンにしてonDraw()、適切なビットマップを描画します。

私の問題は、onDraw()メソッドが呼び出されないことです(デバッグメッセージで確認されています)。

LayeredImageViews のアダプターをクラスImageViewAdapter拡張で保持し、適切な Bitmap 引数を使用しBaseAdaptergetView(...)メソッド呼び出しを行います。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;
}

どんな助けでも大歓迎です。ありがとう!

4

0 に答える 0