Android:从Bitmap裁剪位图并设置为ImageView src

时间:2015-04-25 10:34:51

标签: java android bitmap

我试图从spritesheet裁剪精灵,但裁剪的图像不是我指定的图像的一部分。

spritesheet包含大小为32 x 32 px的精灵,因此第一个精灵应该是0到32(水平)和0到32(垂直)的像素,假设最左上角的像素是[0,0]

Bitmap spritesheet = BitmapFactory.decodeResource(getResources(), R.drawable.spritesheet_32x32);
Bitmap sprite = Bitmap.createBitmap(spritesheet, 0, 0, 32, 32);

ImageView只是一个没有src,宽度或高度设置的普通ImageView。

ImageView view = (ImageView)findViewById(R.id.player1);
view.setImageBitmap(sprite);

但显示的图像只是第一个精灵的一小部分。 我该怎么监督? view.setImageBitmap(sprite);是正确的方法吗?在设置位图之前,ImageView是否需要固定宽度和高度?

编辑:也许我应该更清楚我的布局。 LinearLayout上有两个ImageView。这是XML:

<LinearLayout
        android:orientation="horizontal"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:baselineAligned="false">
    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:scaleX="-1"
        android:id="@+id/player1"
        android:layout_weight="1"
        android:layout_gravity="center_vertical" />
    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/player2"
        android:layout_weight="1"
        android:layout_gravity="center_vertical" />
</LinearLayout>

1 个答案:

答案 0 :(得分:0)

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;

public class ImageResizer {

public static Bitmap decodeSampledBitmapFromFile(String filename,
    int reqWidth, int reqHeight) {
// First decode with inJustDecodeBounds=true to check dimensions
final BitmapFactory.Options
        options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeFile(filename, options);
// Calculate inSampleSize
options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);
// Decode bitmap with inSampleSize set
options.inJustDecodeBounds = false;
return BitmapFactory.decodeFile(filename, options);
}

public static int calculateInSampleSize(BitmapFactory.Options options,
    int reqWidth, int reqHeight) {
// BEGIN_INCLUDE (calculate_sample_size)
// Raw height and width of image
final int height = options.outHeight;
final int width = options.outWidth;
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;
    }

    // This offers some additional logic in case the image has a strange
    // aspect ratio. For example, a panorama may have a much larger
    // width than height. In these cases the total pixels might still
    // end up being too large to fit comfortably in memory, so we should
    // be more aggressive with sample down the image (=larger inSampleSize).

    long totalPixels = width * height / inSampleSize;

    // Anything more than 2x the requested pixels we'll sample down further
    final long totalReqPixelsCap = reqWidth * reqHeight * 2;

    while (totalPixels > totalReqPixelsCap) {
        inSampleSize *= 2;
        totalPixels /= 2;
    }
}
return inSampleSize;
// END_INCLUDE (calculate_sample_size)
 }

}

调用方法

Bitmap bmp = ImageResizer.decodeSampledBitmapFromFile(new  File(filePath).getAbsolutePath(), 512, 342);               

我没试过但是下面的内容可能会传递方法参数,如
            imageView.getWidth(),imageView.getHeight()