webentwicklung-frage-antwort-db.com.de

Android: Zeichnen einer Leinwand in eine ImageView

Ich bin neu in der Android-Programmierung und was ich versuche herauszufinden, ist dies;

In meinem Layout habe ich TextView, ImageView und Button, alle auf einem vertikal ausgerichteten LinearLayout.

Ich möchte in der ImageView dynamisch Kreise zeichnen können, ohne den Rest meines Layouts (Textansicht/Schaltfläche) zu stören. Ich versuche, eine Leinwand zu erstellen, und benutze die Funktion drawcircle innerhalb der Leinwand, um die Position des Kreises festzulegen. Und dann zeichnen Sie diese Leinwand irgendwie in meine Bildansicht. Ich kann das nicht zum Laufen bringen, gibt es einen Trick? Oder ist meine Methode grundsätzlich falsch? Wie zeichne ich Kreise in die ImageView, ohne mein gesamtes Layout neu zu erstellen? 

Vielen Dank!

28
sil

Ich hatte die gleiche Herausforderung und kam zu dem Schluss, dass das Überschreiben von onDraw zumindest im allgemeinen Fall nicht funktioniert. Mein Blog erklärt die Gründe. Was für mich sehr gut funktioniert hat, ist folgendes:

  1. Erstellen Sie eine neue Bild-Bitmap und fügen Sie eine neue Leinwand hinzu.
  2. Zeichnen Sie die Bild-Bitmap in die Leinwand.
  3. Zeichnen Sie alles andere auf die Leinwand.
  4. Befestigen Sie die Leinwand an der ImageView.

Hier ist ein Codeausschnitt dafür:

import Android.graphics.Bitmap;
import Android.graphics.Canvas;
import Android.graphics.Paint;
import Android.graphics.RectF;
import Android.graphics.drawable.BitmapDrawable;

ImageView myImageView = ...
Bitmap myBitmap = ...
Paint myRectPaint = ...
int x1 = ...
int y1 = ...
int x2 = ...
int y2 = ...

//Create a new image bitmap and attach a brand new canvas to it
Bitmap tempBitmap = Bitmap.createBitmap(myBitmap.getWidth(), myBitmap.getHeight(), Bitmap.Config.RGB_565);
Canvas tempCanvas = new Canvas(tempBitmap);

//Draw the image bitmap into the cavas
tempCanvas.drawBitmap(myBitmap, 0, 0, null);

//Draw everything else you want into the canvas, in this example a rectangle with rounded edges
tempCanvas.drawRoundRect(new RectF(x1,y1,x2,y2), 2, 2, myPaint);

//Attach the canvas to the ImageView
myImageView.setImageDrawable(new BitmapDrawable(getResources(), tempBitmap));
30
Nantoka
     ImageView imageView=(ImageView) findViewById(R.id.image);
        Bitmap bitmap = Bitmap.createBitmap(100, 100, Bitmap.Config.ARGB_8888);    
        Canvas canvas = new Canvas(bitmap);
        Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
        Paint.setColor(Color.BLACK);
        canvas.drawCircle(50, 50, 10, Paint);
        imageView.setImageBitmap(bitmap);
25

Ich denke, ein besserer Ansatz wäre, eine benutzerdefinierte ImageView zu erstellen und die onDraw-Methode zu überschreiben. So etwas wie:

public class CustomView extends ImageView {

public CustomView(Context context) {
    super(context);
}

public CustomView(Context context, AttributeSet attrst) {
    super(context, attrst);
}

public CustomView(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
}

MyBitmapFactory bitMapFac = null;
public void setBitmapFactory(MyBitmapFactory bitMapFac)
{
    this.bitMapFac = bitMapFac;
}

@Override
public void onDraw(Canvas canvas) {

    canvas.drawColor(Color.TRANSPARENT);
    /*instantiate a bitmap and draw stuff here, it could well be another
    class which you systematically update via a different thread so that you can get a fresh updated
    bitmap from, that you desire to be updated onto the custom ImageView. 
   That will happen everytime onDraw has received a call i.e. something like:*/
    Bitmap myBitmap = bitMapFac.update(); //where update returns the most up  to date Bitmap
    //here you set the rectangles in which you want to draw the bitmap and pass the bitmap        
    canvas.drawBitmap(myBitMap, new Rect(0,0,400,400), new Rect(0,0,240,135) , null);
    super.onDraw(canvas);
    //you need to call postInvalidate so that the system knows that it  should redraw your custom ImageView
    this.postInvalidate();
}
}

Es ist eine gute Idee, eine Logik zu implementieren, die prüft, ob eine neue Bitmap über die update () -Methode abgerufen werden soll, damit der Code in onDraw nicht jedes Mal ausgeführt wird und Systemaufwand verursacht.

Und verwenden Sie Ihre benutzerdefinierte Ansicht, wo immer Sie sie benötigen. Der einfachste Weg wäre, es direkt in der Datei activity_layout.xml als solche zu deklarieren:

   <com.mycustomviews.CustomView
        Android:id="@+id/customView"
        Android:layout_centerInParent="true"
        Android:layout_height="135dp"
        Android:layout_width="240dp"
       Android:background="@Android:color/transparent"/>

Und dann ist der Zugriff wie in jeder anderen Ansicht in Ihrem Code, indem Sie Folgendes verwenden:

   customView = (CustomView) findViewById(R.id.customView);
5
Lys

Wenn Sie eine XML-Datei mit Layout haben, bei der alle Elemente in vertikaler Ausrichtung angeordnet sind.

Sie können erreichen, was Sie möchten, indem Sie in Ihrem Paket eine Klasse erstellen, die die Klassenansicht erweitert und die onDraw-Methode überschreibt. Zeichnen Sie einen Kreis, wie Sie möchten.

Fügen Sie dann anstelle von imageView im Layout diese eigene Ansicht im XML-Layout hinzu

<LinearLayout>

 < TextView> < /TextView>

  < Button> < /Button>

  <com.prac.MyView> </ com.prac.MyView>

</ LinearLayout>

Überprüfen Sie den folgenden Link für 2D-Grafiken. Es ist ein tolles Tutorial zu lesen .  
http://organicandroid.blogspot.com/2010/08/starten-mit-grafiken.html
Ich hoffe das hilft : )

0
Javanator

Es gibt verschiedene Möglichkeiten, um das zu tun, was Sie möchten, aber eine ImageView wie beschrieben zu verwenden, gehört nicht dazu. Eine Möglichkeit ist, dass ImageView ein animiertes Drawable anzeigt. Sie können sich darauf konzentrieren, dass Ihre Drawable-Implementierung die Kreise zeichnet. Eine andere besteht darin, jedes Mal, wenn Sie das Bild ändern möchten, eine neue Bitmap zu erstellen und ImageView so einzustellen, dass die neue Bitmap angezeigt wird. Normalerweise wird dazu jedoch eine benutzerdefinierte View-Unterklasse erstellt. Das Beispielprojekt API Demos enthält ein Beispiel für eine benutzerdefinierte Ansicht. Bei Google finden Sie viele Tutorials.

0
Ted Hopp