2012-04-02 4 views
1

Я ищу, чтобы разработать простое приложение, которое содержит представление галереи и изображение, а нажатие на изображение позволит установить изображение в качестве обоев.Wallpaper chooser tutorial?

Я пробовал несколько руководств, но изображения, которые я хочу использовать, довольно большие и всегда получают исключение 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);