2012-04-02 61 views
1

我正在寻找开发一个简单的应用程序,其中包含一个图库视图和一个图像视图,点击图像视图将图像设置为壁纸。壁纸选择器教程?

我尝试了以下几个教程,但我想要使用的图像非常大,并且总是会出现OOM异常。在设置它们之前,我曾尝试使用bitmapfactory对它们进行缩放,但我无法使其正常工作。我到目前为止已经在下面。我不认为这会如此困难..任何人都可以帮助我确定接下来我需要做什么?

谢谢!

package org.androidpeople.gallery; 

import java.io.IOException; 
import java.io.InputStream; 


import android.app.Activity; 
import android.app.AlertDialog; 
import android.content.Context; 
import android.content.DialogInterface; 
import android.content.res.TypedArray; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.AdapterView; 
import android.widget.BaseAdapter; 
import android.widget.Gallery; 
import android.widget.ImageView; 
import android.widget.AdapterView.OnItemClickListener; 

public class GalleryExample extends Activity { 

private Gallery gallery; 
private ImageView imgView; 
int position; 
private Integer[] Imgid = { R.drawable.hm001, R.drawable.hm002, R.drawable.hm003, 
     R.drawable.hm004, R.drawable.hm005, R.drawable.hm006,    R.drawable.hm007 }; 

/* (non-Javadoc) 
* @see android.app.Activity#onCreate(android.os.Bundle) 
*/ 
@Override 
public void onCreate(Bundle home) { 
    super.onCreate(home); 
    setContentView(R.layout.main); 
    position = 0; 
    imgView = (ImageView) findViewById(R.id.ImageView01); 
    imgView.setImageResource(Imgid[0]); 
    gallery = (Gallery) findViewById(R.id.examplegallery); 
    gallery.setAdapter(new AddImgAdp(this)); 
    Bitmap bm; 
bm = Bitmap.createScaledBitmap(bm, 213, 189, true); 





    gallery.setOnItemClickListener(new OnItemClickListener() { 
     public void onItemClick(AdapterView parent, View v, int position, 
       long id) { 

      imgView.setImageResource(Imgid[position]); 
      GalleryExample.this.position = position; 
     } 
    }); 


    imgView.setOnLongClickListener(new View.OnLongClickListener() { 
     public boolean onLongClick(View v) { 

      AlertDialog alertDialog = new AlertDialog.Builder(
        GalleryExample.this).create(); 
      alertDialog.setTitle("Confirmation"); 
      alertDialog 
        .setMessage("Do you want to set this image as wallaper?"); 
      alertDialog.setButton("Yes", 
        new DialogInterface.OnClickListener() { 
         public void onClick(DialogInterface dialog, 
           int which) { 

          Bitmap bitmap = BitmapFactory.decodeResource(
            getResources(), Imgid[position]); 
          try { 
           GalleryExample.this.setWallpaper(bitmap); 
          } catch (IOException e) { 
           // TODO Auto-generated catch block 
           e.printStackTrace(); 
          } 
          Log.d("Gallery Example", "Image setted."); 

         } 
        }); 

      alertDialog.show(); 
      return true; 
     } 
    }); 

} 

public class AddImgAdp extends BaseAdapter { 
    int GalItemBg; 
    private Context cont; 

    public AddImgAdp(Context c) { 
     cont = c; 
     TypedArray typArray = obtainStyledAttributes(R.styleable.GalleryTheme); 
     GalItemBg = typArray.getResourceId(
       R.styleable.GalleryTheme_android_galleryItemBackground, 0); 
     typArray.recycle(); 
    } 

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

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

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

    public View getView(int position, View convertView, ViewGroup parent) { 
     ImageView imgView = new ImageView(cont); 

     imgView.setImageResource(Imgid[position]); 
     imgView.setLayoutParams(new Gallery.LayoutParams(80, 70)); 
     imgView.setScaleType(ImageView.ScaleType.FIT_XY); 
     imgView.setBackgroundResource(GalItemBg); 

     return imgView; 
    } 
    Bitmap ShrinkBitmap(Resource, int width, int height){ 

     BitmapFactory.Options bmpFactoryOptions = new BitmapFactory.Options(); 
      bmpFactoryOptions.inJustDecodeBounds = true; 
      Bitmap bitmap = BitmapFactory.decodeResource(null, String, bmpFactoryOptions); 

      int heightRatio = (int)Math.ceil(bmpFactoryOptions.outHeight/(float)height); 
      int widthRatio = (int)Math.ceil(bmpFactoryOptions.outWidth/(float)width); 

      if (heightRatio > 1 || widthRatio > 1) 
      { 
      if (heightRatio > widthRatio) 
      { 
       bmpFactoryOptions.inSampleSize = heightRatio; 
      } else { 
       bmpFactoryOptions.inSampleSize = widthRatio; 
      } 
      } 

      bmpFactoryOptions.inJustDecodeBounds = false; 
      bitmap = BitmapFactory.decodeFile(file, bmpFactoryOptions); 
     return bitmap; 
     } 
    } 
} 

}

回答

0

只是把bm = Bitmap.createScaledBitmap(bm, 213, 189, true);低于

public void onClick(DialogInterface dialog, int which) { 
    Bitmap bitmap = BitmapFactory.decodeResource(getResources(), Imgid[position]); 

我的意思是最后的观点是应该的;

public void onClick(DialogInterface dialog, int which) { 
    Bitmap bitmap = BitmapFactory.decodeResource(getResources(), Imgid[position]); 
    bitmap = Bitmap.createScaledBitmap(bm, 213, 189, true);