1

私はしばらくの間壁紙アプリに取り組んでいて、それはほとんど完了していますが、アプリのサイズはかなり大きいので、.png拡張子を使用しているので、現在、resのpngではなくアセットを介してjpgをロードしようとしています

この回答を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

サンプルコードに従って、アセットフォルダーからコードローダーイメージを作成しました

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");
    }
于 2015-01-24T11:15:18.970 に答える