Mittwoch, 20. November 2013

Android: Grafik in Layout einfügen

Im vorigen Post habe ich zur Erstellung von Grafiken empfohlen, eine Klasse von View abzuleiten, in dieser das Zeichnen zu erledigen und diese Klasse dann als Layout festzulegen.
Dies führt nun scheinbar zu Problemen bei fortgeschritteneren Apps, wenn man außerdem Steuerelemente etc. auf der Applikation platzieren möchte, da der Befehl SetContentView() nur einmal aufgerufen werden kann. Also entweder mit dem Layout, welches die Steuerelemente beinhaltet, oder mit der eigenen Klasse, welche die Grafiken zeichnet.
Dieses "Problem" lässt sich aber ganz einfach lösen, in dem wir im Steuerelemente Layout Layout die Grafikklasse wie ein Steuerelement mittels AddView() zum Layout hinzufügen, und dann das Layout der Applikation auf Layout setzen.
Ich denke, der folgende Beispielcode sollte nach Lesen der vorangegangenen Posts selbsterklärend sein. Wir legen hier die Klasse ViewWithOval an, welche fast identisch zur Klasse aus dem vorigen Post ist. Sie zeichnet einen Kreis auf das Formular. Der einzige Unterschied ist die öffentliche Variable paint zur Festlegung der Farbe des Kreises.
In der Funktion OnCreate() der Klasse MainActivity legen wir dann ein Layout mit einem Button an. Beim Klick auf diesen Button ändern wir die Farbe des Kreises und erzwingen das Neuzeichnen mittels Invalidate(). Dann fügen wir den Kreis dem Layout hinzu und legen das Layout der Applikation fest:

using System;
using Android.App;
using Android.Content;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using Android.OS;

namespace CombinedLayouts
{
     [Activity (Label = "CombinedLayouts", MainLauncher = true)]
     public class MainActivity : Activity
     {

          protected override void OnCreate (Bundle bundle)
          {
               base.OnCreate (bundle);

               var Layout = new LinearLayout (this);
               Layout.Orientation = Orientation.Vertical;

               var Button1 = new Button(this);
               Layout.AddView (Button1);

               ViewWithOval OvalGraphic = new ViewWithOval (this);
              
               Button1.Click += delegate {
                    OvalGraphic.paint.SetARGB(255, 255, 0, 0);
                    OvalGraphic.Invalidate();
               };

               Layout.AddView (OvalGraphic);

               SetContentView (Layout);
          }
     }

     public class ViewWithOval : View
     {
          public Android.Graphics.Paint paint = new Android.Graphics.Paint ();
          private readonly Android.Graphics.Drawables.ShapeDrawable Oval;

          public ViewWithOval(Context context) : base (context)
          {         
               paint.SetARGB(255, 0, 255, 0);

               Oval = new Android.Graphics.Drawables.ShapeDrawable(new Android.Graphics.Drawables.Shapes.OvalShape());
               Oval.Paint.Set(paint);

               Oval.SetBounds(0, 0, 500, 500);
          }

          protected override void OnDraw(Android.Graphics.Canvas canvas)
          {
               Oval.Paint.Set(paint);
               Oval.Draw(canvas);
          }
     }
}


Keine Kommentare:

Kommentar veröffentlichen