2017-05-23 4 views
0

Ich habe Unterklasse von ImageView, auf dem ich zeichnen kann (Stift, Rect, Elipse etc ..) und EditText Subviews hinzufügen (ziehbar und kann gedreht werden).Xamarin Android Draw EditText auf Bitmap

Problem ist, wenn ich endgültige Bild bekommen möchte Ich bin mir nicht sicher, wie diese EditText in neues Bild zusammenführen, weil alle Werkzeuge direkt auf Leinwand zeichnen, während ich EditText Texte am Ende zeichnen müssen, da sie brauchen vor dem Klicken auf "Speichern" klickbar und änderbar sein.

Nach vielen verschiedenen Ansätzen ist diese am richtigsten, aber es funktioniert nicht, wenn der Text um ein gewisses Maß gedreht wird.

public Bitmap GetFinalBitmap() 
    { 
     this.DrawingCacheEnabled = false; 
     this.DrawingCacheEnabled = true; 

     var finalImage = Bitmap.CreateBitmap(GetDrawingCache(true)); 
     foreach (var item in this.pathLists) 
     { 
      if (item.TextView != null) 
      { 
       item.TextView.BuildDrawingCache(true); 
       var txt = item.TextView.GetDrawingCache(true); 
       finalImage = Overlay(finalImage, txt, item.TextView.GetX(), item.TextView.GetY()); 
      } 
     } 

     return finalImage; 
    } 

    public Bitmap Overlay(Bitmap bmp1, Bitmap bmp2, float x, float y) 
    { 
     Bitmap bmOverlay = Bitmap.CreateBitmap(bmp1.Width, bmp1.Height, bmp1.GetConfig()); 
     Canvas canvas = new Canvas(bmOverlay); 
     canvas.DrawBitmap(bmp1, new Matrix(), null); 
     canvas.DrawBitmap(bmp2, x, y, null); 
     return bmOverlay; 
    } 

Jede mögliche Hilfe (update Lösung oder vielleicht neuen Ansatz, wie EditText mit korrekten Koordinaten auf ImageView's Bitmap zeichnen) geschätzt.

Antwort

0

Im Grunde musste ich nur die zweite Bitmap zeichnen (eine der EditText) mit Matrix. Hier ist der aktualisierte Code, der auch für gedrehte EditText funktioniert.

public Bitmap Overlay(Bitmap bmp1, Bitmap bmp2, float x, float y, float rotation) 
    { 
     Bitmap bmOverlay = Bitmap.CreateBitmap(bmp1.Width, bmp1.Height, bmp1.GetConfig()); 
     Canvas canvas = new Canvas(bmOverlay); 
     canvas.DrawBitmap(bmp1, new Matrix(), null); 
     var matrix = new Matrix(); 
     matrix.Reset(); 
     if (rotation > 0) 
      matrix.PostRotate(rotation, bmp2.Width/2, bmp2.Height/2); 
     matrix.PostTranslate(x, y);  
     canvas.DrawBitmap(bmp2, matrix, null); 
     return bmOverlay; 
    }