webentwicklung-frage-antwort-db.com.de

Wie mache ich eine Ansicht, um auf Leinwand zu zeichnen?

Ich habe eine kurze Frage:

Angenommen, ich habe eine (veränderbare) Bitmap, die ich ändern muss (Bilder, Texte usw. hinzufügen ...).

Anstatt mit vielen speziellen Klassen für das Zeichnen auf der Leinwand herumzuspielen (Malen, Leinwand, Matrizen usw.), überlegte ich, warum ich die eingebauten Klassen von Android für diese Aufgabe und nur) nicht verwenden sollte Wenn ich wirklich maßgeschneiderte Operationen brauche, könnte ich trotzdem die Leinwand benutzen?

Zum Beispiel könnte ich die folgende Funktion aufrufen, um eine Ansicht (die natürlich keine übergeordnete Ansicht hat) auf der Bitmap anzuzeigen:

public void drawViewToBitmap(Bitmap b, View v, Rect rect) {
    Canvas c = new Canvas(b);
    // <= use rect to let the view to draw only into this boundary inside the bitmap
    view.draw(c);
}

Ist so etwas möglich? Vielleicht funktioniert es sogar so hinter den Kulissen?

was soll ich in den Teil zwischen der Zeichnung und der Erstellung der Leinwand schreiben?


EDIT: Ich habe den nächsten Code ausprobiert, aber es hat nicht funktioniert:

public void drawFromViewToCanvas(final View view, final Rect rect, final Canvas canvas) {
    final int widthSpec = View.MeasureSpec.makeMeasureSpec(rect.width(), View.MeasureSpec.EXACTLY);
    final int heightSpec = View.MeasureSpec.makeMeasureSpec(rect.height(), View.MeasureSpec.EXACTLY);
    view.measure(widthSpec, heightSpec);
    // Lay the view out with the known dimensions
    view.layout(0, 0, rect.width(), rect.height());
    // Translate the canvas so the view is drawn at the proper coordinates
    canvas.save();
    canvas.translate(rect.left, rect.top);
    // Draw the View and clear the translation
    view.draw(canvas);
    canvas.restore();
}

anwendungsbeispiel:

final int imageSize = 50;
rect = new Rect(35, 344 , 35 + imageSize, 344  + imageSize);
final ImageView imageView = new ImageView(mContext);
imageView.setImageBitmap(bitmap);
imageView.setScaleType(ScaleType.CENTER_CROP);
drawFromViewToCanvas(imageView, getRect(), canvas);

BEARBEITEN: Es gibt ein Beispiel auf Sonys Website :

int measureWidth = View.MeasureSpec.makeMeasureSpec(bitmapWidth, View.MeasureSpec.EXACTLY);
int measuredHeight = View.MeasureSpec.makeMeasureSpec(bitmapHeight, View.MeasureSpec.EXACTLY);
view.measure(measureWidth, measuredHeight);
view.layout(0, 0, bitmapWidth, bitmapHeight);
view.draw(canvas);

frage mich, ob es funktioniert.

36

Ja, das kannst du. Denken Sie daran, da Sie es nicht an ein Layout anhängen, müssen Sie es vor dem Zeichnen manuell anordnen:

view.layout(0, 0, viewWidth, viewHeight);

Und wenn Sie nicht genau wissen, was Sie für diese Breiten- und Höhenparameter wollen, können Sie es auch zuerst messen:

int widthSpec = MeasureSpec.makeMeasureSpec (ViewGroup.LayoutParams.WRAP_CONTENT, MeasureSpec.UNSPECIFIED;
int heightSpec = MeasureSpec.makeMeasureSpec (400, MeasureSpec.UNSPECIFIED;
view.measure(widthSpec, heightSpec);
view.layout(0, 0, view.getMeasuredWidth(), view.getMeasuredHeight());

BEARBEITEN:

Wenn Sie bereits die Breite und Höhe kennen, die Sie benötigen:

//Lay the view out with the known dimensions
view.layout (0, 0, rect.width(), rect.height());

//Translate the canvas so the view is drawn at the proper coordinates
canvas.save();
canvas.translate(rect.left, rect.top);

//Draw the View and clear the translation
view.draw(canvas);
canvas.restore();

Erneut BEARBEITEN:

Ja, getestet Sie können dies selbst versuchen:

public class DrawingActivity extends Activity {
    public void onCreate (Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        //Set a Rect for the 200 x 200 px center of a 400 x 400 px area
        Rect rect = new Rect();
        rect.set(100, 100, 300, 300);

        //Allocate a new Bitmap at 400 x 400 px
        Bitmap bitmap = Bitmap.createBitmap(400, 400, Bitmap.Config.ARGB_8888);
        Canvas canvas = new Canvas(bitmap);

        //Make a new view and lay it out at the desired Rect dimensions
        TextView view = new TextView(this);
        view.setText("This is a custom drawn textview");
        view.setBackgroundColor(Color.RED);
        view.setGravity(Gravity.CENTER);

        //Measure the view at the exact dimensions (otherwise the text won't center correctly)
        int widthSpec = View.MeasureSpec.makeMeasureSpec(rect.width(), View.MeasureSpec.EXACTLY);
        int heightSpec = View.MeasureSpec.makeMeasureSpec(rect.height(), View.MeasureSpec.EXACTLY);
        view.measure(widthSpec, heightSpec);

        //Lay the view out at the rect width and height
        view.layout(0, 0, rect.width(), rect.height());

        //Translate the Canvas into position and draw it
        canvas.save();
        canvas.translate(rect.left, rect.top);
        view.draw(canvas);
        canvas.restore();

        //To make sure it works, set the bitmap to an ImageView
        ImageView imageView = new ImageView(this);
        imageView.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
        setContentView(imageView);
        imageView.setScaleType(ImageView.ScaleType.CENTER);
        imageView.setImageBitmap(bitmap);
    }
}
57
kcoppock