Xamarin Android Draw EditText върху Bitmap

Имам подклас от ImageView, върху който мога да рисувам (перо, правоъгълник, елипса и т.н.) и да добавя EditText подизгледи (с възможност за плъзгане и завъртане).

Проблемът е, че когато искам да получа крайно изображение, не съм сигурен как да обединя тези EditText в ново изображение, защото всички инструменти рисуват директно върху платно, докато трябва да начертая EditText текста в края, тъй като те трябва да могат да се плъзгат и може да се променя, преди потребителят да щракне върху Запиши.

След много различни подходи, този е най-правилен, но не работи, ако текстът е завъртян с някаква степен.

    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;
    }

Всяка помощ ще бъде оценена (актуализация на решението или може би нов подход за това как да начертаете EditText с правилни координати върху ImageView's растерно изображение).


person zhuber    schedule 23.05.2017    source източник


Отговори (1)


По принцип всичко, което трябваше да направя, беше да начертая второ растерно изображение (едно от EditText), използвайки матрица. Ето актуализиран код, който работи дори за завъртяни EditText.

    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;
    }
person zhuber    schedule 24.05.2017