从Android文档中将解码后的位图绘制到ImageView

时间:2015-05-27 18:19:36

标签: java android bitmap

我遇到的问题是我的位图导致我的应用程序快速跳过帧。我已经研究过android""显示位图' s"文档,并已在我的代码中实现了一些。

我很确定图片正确加载,但它没有显示在我的应用程序中。我执行此解码后图像视图的高度和宽度为0,因此这可能是其中一个原因,但由于某种原因我无法更改ImageView的大小。

BitmapWorkerTask.java:

class BitmapWorkerTask extends AsyncTask<Integer, Void, Bitmap> {
private final WeakReference<ImageView> imageViewReference;
private int data = 0;

private Context context;

public BitmapWorkerTask(ImageView imageView, Context context) {
    this.context = context;
    // Use a WeakReference to ensure the ImageView can be garbage collected
    imageViewReference = new WeakReference<ImageView>(imageView);
}

// Decode image in background.
@Override
protected Bitmap doInBackground(Integer... params) {
    data = params[0];
    System.out.println("T" + buildBitmap(data, 100, 100));
    return buildBitmap(data, 100, 100);
}

// Once complete, see if ImageView is still around and set bitmap.
@Override
protected void onPostExecute(Bitmap bitmap) {
    if (isCancelled()) {
        bitmap = null;
    }

    if (imageViewReference != null && bitmap != null) {
        final ImageView imageView = imageViewReference.get();
        final BitmapWorkerTask bitmapWorkerTask =
                AsyncDrawable.getBitmapWorkerTask(imageView);
        if (this == bitmapWorkerTask && imageView != null) {
            imageView.setImageBitmap(bitmap);
        }
    }
}

public Bitmap buildBitmap(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(context.getResources(), resId, options);

    // Calculate inSampleSize
    options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);

    // Decode bitmap with inSampleSize set
    options.inJustDecodeBounds = false;
    return BitmapFactory.decodeResource(context.getResources(), resId, options);
}

public int calculateInSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight) {
    final int width = options.outWidth;
    final int height = options.outHeight;
    int inSampleSize = 1;

    if(height > reqHeight || width > reqWidth) {
        final int halfHeight = height / 2;
        final int halfWidth = width / 2;

        // Calculate the largest inSampleSize value that is a power of 2 and keeps both
        // height and width larger than the requested height and width.
        while ((halfHeight / inSampleSize) > reqHeight
                && (halfWidth / inSampleSize) > reqWidth) {
            inSampleSize *= 2;
        }
    }

    return inSampleSize;
}


static class AsyncDrawable extends BitmapDrawable {
    private final WeakReference<BitmapWorkerTask> bitmapWorkerTaskReference;

    public AsyncDrawable(Resources res, Bitmap bitmap, BitmapWorkerTask bitmapWorkerTask) {
        super(res, bitmap);
        bitmapWorkerTaskReference = new WeakReference<BitmapWorkerTask>(bitmapWorkerTask);
    }

    public BitmapWorkerTask getBitmapWorkerTask() {
        return bitmapWorkerTaskReference.get();
    }

    public static boolean cancelPotentialWork(int data, ImageView imageView) {
        final BitmapWorkerTask bitmapWorkerTask = getBitmapWorkerTask(imageView);

        if (bitmapWorkerTask != null) {
            final int bitmapData = bitmapWorkerTask.data;
            // If bitmapData is not yet set or it differs from the new data
            if (bitmapData == 0 || bitmapData != data) {
                // Cancel previous task
                bitmapWorkerTask.cancel(true);
            } else {
                // The same work is already in progress
                return false;
            }
        }
        // No task associated with the ImageView, or an existing task was cancelled
        return true;
    }

    private static BitmapWorkerTask getBitmapWorkerTask(ImageView imageView) {
           if (imageView != null) {
               final Drawable drawable = imageView.getDrawable();
               if (drawable instanceof AsyncDrawable) {
                   final AsyncDrawable asyncDrawable = (AsyncDrawable) drawable;
                   return asyncDrawable.getBitmapWorkerTask();
               }
            }
        return null;
    }
}
}

我在View类的构造函数中创建图像,然后在onDraw方法中绘制TextView。

public Game(Context context) {

    loadBitmap(R.drawable.logo, scoreHolderView);

}

@Override
protected void onDraw(Canvas canvas) {

    if(STATE == State.Playing) {

        synchronized(spawner.activeTiles) {
            for(Iterator<Tile> iter = spawner.activeTiles.iterator(); iter.hasNext();) {
                Tile tile = iter.next();
                canvas.drawRect(tile, tile.getColor());
            }
        }

        //canvas.drawBitmap(scoreholder, null, scoreIcon, null);

        canvas.drawText(String.valueOf(SCORE), 50, 50, blackText);
        scoreHolderView.draw(canvas);
    }
}

ImageView的位置和大小是否由于某种原因未设置?或者我的代码还有其他问题吗?

编辑:

public void loadBitmap(int resId, ImageView imageView) {
    if (AsyncDrawable.cancelPotentialWork(resId, imageView)) {
        final BitmapWorkerTask task = new BitmapWorkerTask(imageView, getContext());
        final AsyncDrawable asyncDrawable =
                new AsyncDrawable(getResources(), logo, task);
        imageView.setImageDrawable(asyncDrawable);
        task.execute(resId);
    }
}

0 个答案:

没有答案