0

ホーム画面のスライドで画像をスライドさせるシンプルなライブ壁紙を作成しようとしています。
だから私はこのコードを書きました。一部のデバイスでは機能しましたが、いくつかのデバイスでメモリ不足エラーが発生しました。
いくつかの大きな画像を保持するには、多くのメモリが必要であることを知っています。

誰かがこのメモリ不足の問題を解決する考えを持っていますか?

void drawFrame() {
    SurfaceHolder holder = getSurfaceHolder();
    Canvas c;
    if(mScreenNo < 1 || isPreview() || offsetOK == false){
        Log.d("drawFrame","mScreenNo < 1 || isPreview()");
        c = holder.lockCanvas();
        c.drawBitmap(bg_I, 0, bgY, p);
    }else{
    float bg_w = bg_I.getWidth();
    Float[] bg_x = new Float[mScreenNo +1];

    for(int i=0; i < bg_x.length; i++){
        bg_x[i] = bgX + bg_w * i;
    }

        c = holder.lockCanvas();

    Log.d("draw"," bgX="+bgX);

    for(int i=0; i < bg_x.length; i++){
        switch(i%3){
        case 0:
        c.drawBitmap(bg_I, bg_x[i], bgY, p);
        break;
        case 1:
        c.drawBitmap(bg_II, bg_x[i], bgY, p);
        break;
            case 2:
        c.drawBitmap(bg_III, bg_x[i], bgY, p);
        break;
            }
    }
    }

    holder.unlockCanvasAndPost(c);
    handler.removeCallbacks(drawThread);
    if (visible)
    handler.postDelayed(drawThread, 25);
    }
    }

onOffsetChanged で、私はこれが好きです。

        @Override
        public void onOffsetsChanged(float xOffset, float yOffset, float xStep,
                float yStep, int xPixels, int yPixels) {
            mXoffset = xOffset;
            mXStep = xStep;
            mXPixels = xPixels;
            mScreenNo = (int)(1/mXStep);//Number of screens(-1)
            mPageNo = (int)(mXoffset / mXStep);//current screen page(the first page is 0)
            mWallStep = getWallpaperDesiredMinimumWidth()/2 /mScreenNo;
            float mwall_screen = rescale.getScreenWidth() / mWallStep;
            bgX = mXPixels * mwall_screen;
            offsetOK = true;
}

あなたの助けが必要です!
あなたの素晴らしいアイデアを待っています。ありがとうございました。

4

1 に答える 1

0

私は自分で問題を解決しました。ばかげた解決方法かもしれませんが、今ではうまく機能しています。

私が問題を解決した方法は、以下のように for ループを変更することでした:

    for(int i=0; i < bg_x.length; i++){
    if(-bg_w < bg_x[i]&& bg_x[i] <= bg_w){
        Log.d("drawFrame","draw this time");
        switch(i%3){
        case 0:
            c.drawBitmap(bg_I, bg_x[i], bgY, p);
            break;
        case 1:
            c.drawBitmap(bg_II, bg_x[i], bgY, p);
            break;
        case 2:
            c.drawBitmap(bg_III, bg_x[i], bgY, p);
            break;
        }
    }else{
        Log.d("drawFrame","no draw this time");
    }
}

これが誰かを助けることを願っています。

于 2012-10-12T04:07:34.833 に答える