从资产加载图像

时间:2013-02-21 21:58:51

标签: android assets baseadapter

我一直在壁纸应用程序工作一段时间,它已经差不多完成但应用程序的大小非常大,因为我使用.png扩展程序所以目前我正在尝试通过资产加载jpg而不是png in res

我试图实现这个答案 Images from Assets folder in a GridView 我在加载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



    };
};

提前感谢您的帮助

2 个答案:

答案 0 :(得分:0)

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

我认为无论如何你使用jpeg或png记忆是非常重要的,在程序中它无论如何都会完全解压缩jpeg

答案 1 :(得分:0)

我在示例code

后面的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不适用于前。

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