8 Stimmen

Wie zentriert man ein Bitmap?

Ich möchte meinen Bitmap in der Mitte meines Bildschirms haben.. ich versuche es auf diese Weise, aber es funktioniert nicht...

Bitmap myBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.compass);

            int w = canvas.getWidth();
            int h = canvas.getHeight();

            int bw=myBitmap.getWidth();
            int bh=myBitmap.getHeight();

            int cx = w / 2;
            int cy = h / 2;

            Display d = getWindowManager().getDefaultDisplay();
            int x = d.getWidth();
            int y = d.getHeight();
            int dx = x / 2;
            int dw = y /2;
            canvas.translate(cx, cy);    
            if (mValues != null) {
                canvas.rotate(-mValues[0]);
            }  

            int centreX = (x  - bw) /2;

            int centreY = (cy - bh) /2;  
            //canvas.drawPath(mPath, mPaint);
            canvas.drawBitmap(myBitmap, centreX,centreY, null);

14voto

Jarno Argillander Punkte 5745

Das ist der Code, den Sie in Ihrer Ansicht benötigen:

private int mWidth;
private int mHeight;
private float mAngle;

@Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
{
    mWidth = View.MeasureSpec.getSize(widthMeasureSpec);
    mHeight = View.MeasureSpec.getSize(heightMeasureSpec);

    setMeasuredDimension(mWidth, mHeight);
}

@Override protected void onDraw(Canvas canvas)
{
    super.onDraw(canvas);
    Bitmap myBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.compass);

    // Hier ist die Magie. Egal, wie Sie es machen, die Logik ist:
    // verfügbaren Platz - Bitmap-Größe und das Ergebnis durch zwei teilen.
    // Es muss eine gleiche Anzahl von Pixeln auf beiden Seiten des Bildes geben.
    // Daher geht der nach dem Anzeigen des Bildes verbleibende Platz zur Hälfte nach links/oben
    // und zur Hälfte nach rechts/unten. Den verfügbaren Platz erhalten Sie, indem Sie die
    // Breite/Höhe des Bildes von den Bildschirmabmessungen subtrahieren. Viel Glück.

    int cx = (mWidth - myBitmap.getWidth()) >> 1; // wie (...) / 2
    int cy = (mHeight - myBitmap.getHeight()) >> 1;

    if (mAngle > 0) {
        canvas.rotate(mAngle, mWidth >> 1, mHeight >> 1);
    }

    canvas.drawBitmap(myBitmap, cx, cy, null);
}

Screenshot nur zum Spaß: http://imgur.com/EYpMJ
(Diagonale Linien sind nicht Teil des hier geposteten Codes)

EDIT: NickTs Lösung hinzugefügt.
EDIT 2: mvalues[0] zu mAngle geändert und bedingt gemacht. Ändern Sie die Division durch 2-Operationen in Bitverschiebungen. Entfernen Sie den Rotationscode, wenn Sie ihn nicht benötigen.

6voto

azamani Punkte 111

Sie können dies versuchen :

        int width = containerBitmap.getWidth();
        int height = containerBitmap.getHeight();
        float centerX = (width  - centeredBitmap.getWidth()) * 0.5f;
        float centerY = (height- centeredBitmap.getHeight()) * 0.5f;

Sie können es verwenden, um eine Bitmap im Zentrum einer anderen Bitmap zu zeichnen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X