If it's any help, I use this method:

public static Bitmap loadResizedBitmap( String filename, int width,
int height, boolean exact ) {
        Bitmap bitmap = null;
        BitmapFactory.Options options = new BitmapFactory.Options();
        options.inJustDecodeBounds = true;
        BitmapFactory.decodeFile( filename, options );
        if ( options.outHeight > 0 && options.outWidth > 0 ) {
                options.inJustDecodeBounds = false;
                options.inSampleSize = 2;
                while (    options.outWidth  / options.inSampleSize > width
                                && options.outHeight / options.inSampleSize > 
height ) {
                        options.inSampleSize++;
                }
                options.inSampleSize--;
                options.inPreferredConfig = Bitmap.Config.RGB_565;

                bitmap = BitmapFactory.decodeFile( filename, options );
                if ( bitmap != null && exact ) {
                        Bitmap oldBitmap = bitmap;
                        bitmap = Bitmap.createScaledBitmap( bitmap, width, 
height, false );
                        oldBitmap.recycle();
                }
        }
        return bitmap;
}

It sets the "inSampleSize" so the resampled image is just bigger than
the given size, then, if exact size is desired, rescales it to exactly
the given dimensions. It also uses RGB 565 to save some memory, you
might want to remove that if you need true color (given the device
supports it...) or alpha channel.
However, even with this method, I sometimes get reports with
OutOfMemoryError. But my app also uses a MediaPlayer instance, which
is quite a memory hog, and allows wallpaper backgrounds, which must be
loaded locally 1.x devices (2.x allows Theme.Wallpaper, which solves
that problem)...

On Aug 31, 1:53 am, "[email protected]" <[email protected]>
wrote:
> Read this link, it helped me ALOT
>
> http://davidjhinson.wordpress.com/2010/05/19/scarce-commodities-googl...
>
> On Aug 30, 1:37 pm, Sheepz <[email protected]> wrote:
>
> > Hi all, I've seen this question asked many times but none of the
> > answers really made sense in what I'm doing... I have an android game
> > (see source at Google source 
> > control:http://code.google.com/p/bestcardgameever-android/source/browse/#svn/...)
> > It's a card game, and I've used a method that redraws each hand every
> > round - that might be wasteful but I couldn't think of a better way to
> > do it. Here is the code for the redrawHand method:
>
> > private void redrawHand(Hand hand) {
> >   ImageView[] cardView = hand.getCardsViews();
> >   View container = hand.getContainer();
> >   for (int i = 0; i < GameData.YANIV_NUM_CARDS; i++) {
> >    PlayingCard card = hand.getCardByLocation(i);
> >    if (card != null) {
> >     // Show Card
> >     cardView[i].setVisibility(View.VISIBLE);
> >     int resId;
> >     if (hand.shouldCardsBeShown()) {
> >      resId = card.getImageResourceId();
> >     } else {
> >      resId = R.drawable.back;
> >     }
> >     cardView[i].setImageResource(resId);
> > if (hand.isHumanPlayer()) {
> >  // when selected, move up 15 pixels
> >  boolean isSelected = hand.isCardSelected(i);
> >  ((LinearLayout.LayoutParams)
> > cardView[i].getLayoutParams()).bottomMargin = isSelected? 15 : 0;}   } else 
> > {
>
> > cardView[i].setVisibility(View.INVISIBLE);   }  }  // Set player name
> > hand.getHandLabelView().setText(hand.getHandLabel());
> > container.requestLayout(); }
>
> > After installing ACRA (http://code.google.com/p/acra/wiki/ACRAHowTo) I
> > have started getting crash reports from devices saying the following:
>
> > java.lang.OutOfMemoryError: bitmap size exceeds VM budget at
> > android.graphics.BitmapFactory.nativeDecodeAsset(Native Method) at
> > android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:363) at
> > android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:212) at
> > android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:
> > 673) at android.content.res.Resources.loadDrawable(Resources.java:
> > 1639) at android.content.res.Resources.getDrawable(Resources.java:535)
> > at android.widget.ImageView.resolveUri(ImageView.java:541) at
> > android.widget.ImageView.setImageResource(ImageView.java:293) at
> > com.geekadoo.ui.Yaniv.redrawHand(Yaniv.java:765) at
> > com.geekadoo.ui.Yaniv.performYaniv(Yaniv.java:539) at
> > com.geekadoo.ui.Yaniv.performYanivHandler(Yaniv.java:503) at
> > com.geekadoo.ui.Yaniv.access$1(Yaniv.java:502) at com.geekadoo.ui.Yaniv
> > $2.onClick(Yaniv.java:323) at android.view.View.performClick(View.java:
> > 2196) at android.view.View.onTouchEvent(View.java:3849) at
> > android.widget.TextView.onTouchEvent(TextView.java:6376) at
> > android.view.View.dispatchTouchEvent(View.java:3385) at
> > android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:872) at
> > android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:872) at
> > android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:872) at
> > android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:872) at
> > android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:872) at
> > android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:872) at
> > android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:872) at
> > android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:872) at
> > com.android.internal.policy.impl.PhoneWindow
> > $DecorView.superDispatchTouchEvent(PhoneWindow.java:1764) at
> > com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneW 
> > indow.java:
> > 1213) at android.app.Activity.dispatchTouchEvent(Activity.java:2066)
> > at com.android.internal.policy.impl.PhoneWindow
> > $DecorView.dispatchTouchEvent(PhoneWindow.java:1748) at
> > android.view.ViewRoot.handleMessage(ViewRoot.java:1561) at
> > android.os.Handler.dispatchMessage(Handler.java:99) at
> > android.os.Looper.loop(Looper.java:123) at
> > android.app.ActivityThread.main(ActivityThread.java:3977) at
> > java.lang.reflect.Method.invokeNative(Native Method) at
> > java.lang.reflect.Method.invoke(Method.java:521) at
> > com.android.internal.os.ZygoteInit
> > $MethodAndArgsCaller.run(ZygoteInit.java:782) at
> > com.android.internal.os.ZygoteInit.main(ZygoteInit.java:540) at
> > dalvik.system.NativeStart.main(Native Method)
>
> > I am not able to understand why this is happening - is there a memory
> > leak? should I somehow release something that I'm missing? Please
> > help, there are a lot of people that can't enjoy this free open source
> > game because of this. Thanks!

-- 
You received this message because you are subscribed to the Google
Groups "Android Developers" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/android-developers?hl=en

Reply via email to