3

ですから、私はJavaとこの種のコーディングに不慣れです。

私はParrallaxスクローリングライブ壁紙を作ろうとしています。しかし、私はメモリの問題を抱えています。

さて、私はそれを作りました、そしてそれは私が持っている電話で動作します。しかし、私がそれを行った方法は、まったく効率的ではないと思います。他の電話で試してみるとうまくいかないからです。それは私のメモリ不足キャッチャーで壊れます。別のレイヤーを追加しましたが、今では私の電話でも同じことをします。だから私はそれをデバッグすることができます。基本的に、私は最大16メガまたはそれ以上のメモリを使用していると思います。

誰かが私のコードを見て、ビットマップをより効率的にロードするのを手伝ってくれるなら、それは大いにありがたいです。

これが私が現在それをしている方法です:

static class Layer {
    public Bitmap bitmap;
    private float scale = 1.0f;
    private Matrix matrix = new Matrix();
    public Layer(Bitmap b) {
        this.bitmap = b;
    }
    public void setScale(float factor) {
        scale = factor;
    }
    public Matrix getMatrix(float x, float y) {
        if (scale == 1) {
            matrix.reset();
        } else {
            matrix.setScale(scale, scale);
        }
        matrix.postTranslate(x, y);
        return matrix;
    }
}

public static List<Integer> findLayers(Integer path) {

    List<Integer> files = new ArrayList<Integer>();


    files.add(R.drawable.planet_layer4);
    files.add(R.drawable.planet_layer3);
    files.add(R.drawable.planet_layer2);
    files.add(R.drawable.planet_layer1);    
    files.add(R.drawable.planet_layer0);

    return files;
}   



    private void loadLayers() {
        try {
            clearLayers();
            for (Integer file: layerFiles) {
                addLayer(file);
            }
            recalibrateLayers();
        } catch (IOException e) {
            layers.clear();
            Toast.makeText(LiveWallpaper.this, "There was a problem loading the wallpaper. Please contact the developer.", Toast.LENGTH_LONG).show();
        } catch (OutOfMemoryError oom) {
            layers.clear();
            Toast.makeText(LiveWallpaper.this, "Whoops, we ran out of memory trying to load the images. ", Toast.LENGTH_LONG).show();
        }
    }

    private void addLayer(int name) throws IOException {
        Bitmap layer = BitmapFactory.decodeResource(getResources(), name);
        if (layer == null) {
            throw new IOException("BitmapFactory couldn't decode asset " + name);
        }
        synchronized(layers) {
            layers.add(new Layer(layer));
        }
    }

    private void clearLayers() {
        synchronized(layers) {
            layers.clear();
        }
    }

    private void recalibrateLayers() {
        for (Layer layer : layers) {
            final int bitmapHeight = layer.bitmap.getHeight();
            layer.setScale((float)mHeight / (float)bitmapHeight);
        }
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        mHandler.removeCallbacks(mDrawParallax);
    }


    @Override
    public void onSurfaceChanged(SurfaceHolder holder, int format, int width, int height) {
        super.onSurfaceChanged(holder, format, width, height);

        mHeight = height;

        recalibrateLayers();

        drawBackgrounds();

    }

そして、ここに私がそれらを描きます。

/*
     * Draw one frame of the animation. This method gets called repeatedly
     * by posting a delayed Runnable. You can do any drawing you want in
     * here.
     */
    void drawBackgrounds() {
        final SurfaceHolder holder = getSurfaceHolder();
        final Rect frame = holder.getSurfaceFrame();

        mFrame = frame;

        Canvas c = null;
        try {
            c = holder.lockCanvas();
            if (c != null) {
                // draw something
                drawParallax(c);
            }
        } finally {
            if (c != null) holder.unlockCanvasAndPost(c);
        }


    }

    void drawParallax(Canvas c) {
        int frameWidth = mFrame.width();

        for (int i=layers.size()-1; i>=0; i--) {
            Layer layer = layers.get(i);
            Bitmap bitmap = layer.bitmap;
            float bitmapWidth = bitmap.getWidth() * layer.scale;
            float max = frameWidth - bitmapWidth;
            float offset = mOffset * max;

            final Matrix m = layer.getMatrix(offset, 0);

            c.drawBitmap(bitmap, m, null);
        }


    }
4

0 に答える 0