2016-07-10 22 views
-1

Ich bin absolut neu in Android und ich mache etwas Experiment mit dem Canvas Objekt.Wie kann ich die Canvas-Klasse verwenden, um ein Bild in einem ImageView in dieser einfachen Android-App anzuzeigen?

Ich versuche es zu einerLeinwand hinzufügen und dann zeigen, in ein abgerufenen Image (Ich weiß, dass dies nicht der Standard und einfachste Weg, um ein Bild in ein Image zu zeigen, aber dies ist nur eine vereinfachte Experimentieren Sie für eine weitere komplexere Sache, die ich tun muss mit Canvas).

So habe ich ein star.png (ein 32x32 Pixel Symbol in meinen /res/ziehbar/ Ordnern) und ich versuche zu

Das ist meine activity_main.xml Layout-Konfigurationsdatei:

<?xml version="1.0" encoding="utf-8"?> 

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
android:orientation="vertical" > 

    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Hello World!" /> 

    <ImageView 
     android:id="@+id/star_container" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" /> 

</LinearLayout> 

Dieses Layout enthält das Image mit id = star_container das ist, wo die I zeichnen muss Bild mit der Leinwand

Und das ist die MainActivity Klasse, die diese Ansicht Griff:

public class MainActivity extends AppCompatActivity { 


    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 


     ImageView imgView = (ImageView) findViewById(R.id.star_container); 

     Canvas canvas; 

     Bitmap star = BitmapFactory.decodeResource(getResources(), R.drawable.star); 
     Bitmap output = Bitmap.createBitmap(32, 32, Bitmap.Config.ARGB_8888); 
     canvas = new Canvas(output); 

     canvas.drawBitmap(star, star.getWidth() + 2, 0, null); 

     imgView.setImageDrawable(new BitmapDrawable(getResources(), output)); 


    } 
} 

So in die onCreate() Methode, die ich rufe Sie das Image, wo das Bild haben, gelegt werden. Dann erstelle ich ein Bitmap Objekte der star.png Bild von den resoruces abgerufen werden, um auf die otuput Bitmap hinzugefügt wird mit der Leinwand.

Schließlich stelle ich diese Ausgabe Bitmap in den Abruf ImageView.

So erwartete ich, dass, wenn der App läuft, wird das vorherige Image das star.png Bild enthält, aber es wird nicht angezeigt.

Ich habe keinen Fehler, wenn ich diese App ausführe, aber die einzige Ausgabe, die ich erhalte, ist die Textnachricht, die in TextView definiert ist.

Warum? Was ist falsch? Was vermisse ich? Wie kann ich diesen Code ändern und es funktionieren lassen?

+0

Das ist nicht, wie Sie Canvas überhaupt verwenden. Um eine Ansicht mithilfe eines Canvas-Bereichs zu zeichnen, erstellen Sie eine benutzerdefinierte View-Klasse und überschreiben onDraw. Sie erhalten eine Leinwand, auf die Sie zeichnen können. Der Code, den Sie hier haben, ist so verworren, dass er nicht veräußerlich ist. –

Antwort

0

eine andere Art und Weise - rect Bereich mit:

Canvas canvas; 

    Bitmap star = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher); 
    Bitmap output = Bitmap.createBitmap(star.getWidth(), star.getHeight(), Bitmap.Config.ARGB_8888); 
    canvas = new Canvas(output); 
    Rect source = new Rect(0, 0, star.getWidth(), star.getHeight()); 
    canvas.drawBitmap(star, null, source, null);  
    imgView.setImageBitmap(output); 
+0

Nein, ich kann nicht, weil, wie erklärt, dies der erste Schritt ist, um zu verstehen, wie man Canvas benutzt. Jetzt versuche ich mit einem einzelnen Bild, aber ich brauche Canvas, weil ich eine Bildkomposition erstellen muss – AndreaNobili

1

die Dokumente nach:

links: Die Position der linken Seite des Bitmap

Das Problem gezogen wird ist hier:

canvas.drawBitmap(star, star.getWidth() + 2, 0, null); 

Sie einen Wert für die linken, die aus Bitmap-Grenzen ist, also nichts gezogen wird, versuchen Sie dies: canvas.drawBitmap(star, 0, 0, null);

Android API stellt ein weiteres Verfahren Bitmap als drawable direkt zu setzen: ImageView#setImageBitmap(Bitmap bm)

Ich denke, Es ist eine bessere Praxis, eine benutzerdefinierte View implementieren und erkunden Canvas Fähigkeiten dort (in onDraw Methode)