1

我已经在墙纸应用程序上工作了一段时间,几乎完成了,但是应用程序的大小非常大,因为我使用 .png 扩展名,所以目前我正在尝试通过资源加载 jpg 而不是 res 中的 png

我试图 在 GridView 中实现这个答案来自 Assets 文件夹的图像 我在加载 imageadapter 时出错

  • 02-21 23:13:05.883:E/AndroidRuntime(17634):致命异常:主要
  • 02-21 23:13:05.883: E/AndroidRuntime(17634): java.lang.RuntimeException: 无法启动活动 ComponentInfo{com.example.imagieview05/com.example.imagieview05.MainActivity}: java.lang.NullPointerException

这是我的代码

public class MainActivity extends Activity {
private GridView mGridView;
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

     mGridView = (GridView) findViewById(R.id.GridView1);

    Bitmap[] mBitArray  = new Bitmap[4];
    try {
    mBitArray[0] = getBitmapFromAssets("g1p2.jpg");
    mBitArray[1] = getBitmapFromAssets("g1p1.jpg");
    mBitArray[2] = getBitmapFromAssets("g1p3.jpg");
    mBitArray[3] = getBitmapFromAssets("g1p4.jpg");

    } catch (Exception e) {
         e.printStackTrace();
    }


  mGridView.setAdapter(new ImageAdapter(this ,mBitArray));

}
public Bitmap getBitmapFromAssets (String filename) throws IOException{
    AssetManager assetManager = getAssets();
    InputStream istr = assetManager.open(filename);
    Bitmap bitmap = BitmapFactory.decodeStream(istr);
    return bitmap;  
}




  public class ImageAdapter extends BaseAdapter{


private Context mContext;
private Bitmap[] mImageArray;


public GallaryAdapter(Context c, Bitmap[] mBitArray) {
    c = mContext;
    mBitArray = mImageArray;
}

public int getCount() {
    return mImageArray.length;
}
public Object getItem(int position) {
    // TODO Auto-generated method stub
    return mImageArray[position];
}
public long getItemId(int position) {
    // TODO Auto-generated method stub
    return position;
}

public View getView(int position, View convertView, ViewGroup parent) {
     ImageView imgView = new ImageView(mContext);
     imgView.setImageBitmap(mImageArray[position]);
     //put black borders around the image
     imgView.setScaleType(ImageView.ScaleType.CENTER_CROP);
     imgView.setLayoutParams(new GridView.LayoutParams(120, 120));
     return imgView;

}

这是没有资产参考的原始工作代码

 public class MainActivity extends Activity {

  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    GridView gridView =  (GridView) findViewById(R.id.GridView1);
    gridView.setAdapter(new ImageAdapter(this));


public class ImageAdapter extends BaseAdapter {

 private Context mContext;


    public ImageAdapter(Context c) {
        mContext = c;
    }

    public int getCount() {
        return mThumbIds.length;
    }

    public Object getItem(int position) {
        return null;
    }

    public long getItemId(int position) {
        return 0;
    }

    // create a new ImageView for each item referenced by the Adapter
    public View getView(int position, View convertView, ViewGroup parent) {
        ImageView imageView;
        if (convertView == null) {  // if it's not recycled, initialize some attributes
            imageView = new ImageView(mContext);
            imageView.setLayoutParams(new GridView.LayoutParams(150, 150));
            imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
            imageView.setPadding(8, 8, 8, 8);
        } else {
            imageView = (ImageView) convertView;
        }

        imageView.setImageResource(mThumbIds[position]);
        return imageView;
    }

    // references to our images
    private Integer[] mThumbIds = {
            R.drawable.g1p1, R.drawable.g1p2,
            R.drawable.g1p3, R.drawable.g1p4,
            R.drawable.g1p5, R.drawable.g1p6,
            R.drawable.g1p22, R.drawable.g1p33,
            R.drawable.g1p44, R.drawable.g1p55,
            R.drawable.g1p5, R.drawable.g1p6,
            R.drawable.g1p22, R.drawable.g1p33,
            R.drawable.g1p44, R.drawable.g1p55



    };
};

提前感谢您的帮助

4

2 回答 2

0

mBitArray = mImageArray; 它将 mBitArray 指向 mImageArray 女巫什么都不是,也许?

我认为无论如何使用jpeg或png内存并不重要,在程序中它无论如何都会完全解压缩jpeg

于 2013-02-21T23:55:00.780 回答
0

我按照示例代码从 assets 文件夹中编写了代码加载器图像

private Bitmap decodeStreamFromAssets(String path, int reqWidth, int reqHeight) {

    InputStream ims = null;

    try {

        ims = getAssets().open(path);
        // First decode with inJustDecodeBounds=true to check dimensions
        final BitmapFactory.Options options = new BitmapFactory.Options();
        options.inJustDecodeBounds = true;
        BitmapFactory.decodeStream(ims, null, options);

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

        // Decode bitmap with inSampleSize set
        options.inJustDecodeBounds = false;
        return BitmapFactory.decodeStream(ims, null, options);
    }
    catch (IOException e) {

        e.printStackTrace();
    }
    finally {

        if (ims != null) {
            try {

                ims.close();
            }
            catch (IOException e) {

                e.printStackTrace();
            }
        }
    }

    return null;
}

private 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) {

        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;
}

加载 *.jpg 作品,但 *.png 不适用于 ex。

IMG // 工作

Bitmap bitmap = decodeStreamFromAssets("test.jpg", 64, 64);
    if(bitmap1 != null){

        imageViewTest.setImageBitmap(bitmap);
    }
    else {

        Log.e("ERROR", "error");
    }

PNG // 不工作(是错误)

Bitmap bitmap = decodeStreamFromAssets("test.png", 64, 64);
    if(bitmap1 != null){

        imageViewTest.setImageBitmap(bitmap);
    }
    else {

        Log.e("ERROR", "error");
    }
于 2015-01-24T11:15:18.970 回答