1

画面内の 1 つの画像をすばやく変更したい。htc Desire s または sumsung s1 では問題ありません。ただし、s3または大画面デバイスにアプリをインストールする場合。画像がゆっくりと変化し、しばらくするとアプリを強制終了します。エラーは次のとおりです。「6354208 バイトの割り当てでメモリが不足しています。」画像の解像度を変更すると、より適切に動作しますが、エラーは修正されず、時々発生します。s3 の使用メモリは 35 MB です!!!

        float accelationSquareRoot = (x * x + y * y + z * z)
            / (SensorManager.GRAVITY_EARTH * SensorManager.GRAVITY_EARTH);
    long actualTime = System.currentTimeMillis();
    if (accelationSquareRoot >= 1.5) //
    {
        if (actualTime - lastUpdate < 30) {

            return;
        }
        Random r=new Random();
        randomWord+=r.nextInt(3);
        randomWord%=4;
        lastUpdate = actualTime;

        isStarted=true;
//          ((BitmapDrawable)shakedButton.getDrawable()).getBitmap().recycle();
        switch (randomWord) {
        case 0:
            shakedButton.setImageResource(R.drawable.alef);
            break;
        case 1:
            shakedButton.setImageResource(R.drawable.b);
            break;
        case 2:
            shakedButton.setImageResource(R.drawable.jim);
            break;
        case 3:
            shakedButton.setImageResource(R.drawable.dal);
            break;


        }
    }
4

2 に答える 2

2

ターゲットが From Api レベル 10 の場合、アプリケーション タグで Android:largeHeap="true" を使用できます。次のリンクを参照してください。

于 2013-07-10T06:48:46.990 に答える
2

私はキャンバスを使用していますが、結果はとても良いです

私はこのクラスを書きます:

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.view.View;

public class MyView extends View {

private int imageIndex;

private int dstWidth;
private int dstHeight;
private int x, y;

public MyView(Context context) {
    super(context);

    imageIndex = 0;

    dstWidth = 265;
    dstHeight = 240;

    x = 0;
    y = 0;
}

@Override
protected void onDraw(Canvas canvas) {

    Bitmap harf;

    if( imageIndex == 0 )
        harf = BitmapFactory.decodeResource( getResources(), R.drawable.alef);
    else if( imageIndex == 1 )
        harf = BitmapFactory.decodeResource( getResources(), R.drawable.b );
    else if( imageIndex == 2 )
        harf = BitmapFactory.decodeResource( getResources(), R.drawable.jim );
    else
        harf = BitmapFactory.decodeResource( getResources(), R.drawable.dal );

    Bitmap mBitmap = Bitmap.createScaledBitmap( harf, dstWidth, dstHeight, true);

    canvas.drawBitmap(mBitmap, x, y, null);     
}

public void setIndexAndDraw( int index )
{
    imageIndex = index;
    invalidate();
}
}

onCreateメソッドでこの方法でshakedViewを初期化しました

    MyView shakedView;
    lp.addRule(RelativeLayout.CENTER_VERTICAL);
    lp.addRule(RelativeLayout.CENTER_HORIZONTAL);
    lp.leftMargin=70;
    shakedView=new MyView(this);
    rLayout.addView(shakedView,lp);

質問の私のコードはこのように変わります

if (accelationSquareRoot >= 1.5) //
    {
        if (actualTime - lastUpdate < 30) {

            return;
        }
        Random r=new Random();
        randomWord+=r.nextInt(3);
        randomWord%=4;
        lastUpdate = actualTime;
        Toast.LENGTH_SHORT).show();
        isStarted=true;
        shakedView.setIndexAndDraw(randomWord);

    }
于 2015-10-04T06:21:48.197 に答える