Метод OnDraw не работает правильно / как ожидалось Xamarin.Forms - PullRequest
0 голосов
/ 04 июля 2019

Моя главная проблема - это своего рода поведение пользовательского интерфейса, которое разрушает мой пользовательский рисунок на экране в Xamarin.Forms, платформенном рендерере для Android.

Я рисую прямоугольник полупрозрачного черного цвета. Этот прямоугольник имеет полноэкранный размер. Он наследует меньший прямоугольник с размером и угловым радиусом рамки, лежащей поверх пользовательского вида. Внутренний прямоугольник рисует с помощью Xfermode (PorterDuff.Mode) Src_Out. Результатом является полноэкранный прямоугольник с маленьким прямоугольником внутри, который полностью прозрачен.

Это работает вполне нормально, но только по особому сценарию.

Когда я хочу нарисовать только этот пользовательский вид, мой интерфейс обновляется каким-то образом, которого я не ожидаю. Полный вид отображается правильно, но через 0,5-1 сек пользовательский интерфейс обновляется, и маленький прозрачный прямоугольник каким-то образом исчезает.

Когда у меня есть это настраиваемое представление внутри макета стека и поверх любого другого элемента управления, оно не будет обновляться / исчезать со временем.

Я использую Xamrin.Forms 4.1 в VS 19. ContentPage содержит ZXingQrCodeView и некоторые другие элементы управления для отображения текста и поведения.

Тип настраиваемого представления - ContentView, он не имеет дополнительных привязываемых свойств. Он используется просто для того, чтобы иметь «новое» представление контента для работы.

Это моя вторая попытка нарисовать представление, конкурирующее с OnDraw, в xamarin формах у меня есть хорошие знания, я пытался изменить тип настраиваемого представления на stacklayout.

Содержимое ContentPage

<ContentPage.Content>
        <StackLayout HorizontalOptions="FillAndExpand" VerticalOptions="FillAndExpand">
            <customviews:HeaderTextView Margin="0,0,0,0" />
            <Grid HorizontalOptions="FillAndExpand" VerticalOptions="FillAndExpand">


                <Label
                    Grid.Row="0"
                    Grid.Column="0"
                    Margin="40,17,40,0"
                    FontSize="Small"
                    HorizontalOptions="FillAndExpand"
                    Text="Scannen Sie den QR-Code Ihrer Maschine"
                    TextColor="DarkGray"
                    VerticalOptions="Start" />

                <forms:ZXingScannerView
                    Grid.Row="0"
                    Grid.Column="0"
                    AutomationId="zxingScannerView"
                    HorizontalOptions="FillAndExpand"
                    IsAnalyzing="{Binding isAnalyzing}"
                    IsScanning="{Binding isScanning}"
                    ScanResultCommand="{Binding resultCommand}"
                    VerticalOptions="FillAndExpand" />


                <customcontrols:CustomContentView
                    Grid.Row="0"
                    Grid.Column="0"
                    HorizontalOptions="FillAndExpand"
                    VerticalOptions="FillAndExpand">

                    <StackLayout HorizontalOptions="FillAndExpand" VerticalOptions="FillAndExpand">
                        <Frame
                            x:Name="clearFrame"
                            Padding="0"
                            BackgroundColor="Transparent"
                            BorderColor="#FE6A00"
                            CornerRadius="10"
                            HeightRequest="295"
                            HorizontalOptions="CenterAndExpand"
                            VerticalOptions="CenterAndExpand"
                            WidthRequest="295" />
                    </StackLayout>

                </customcontrols:CustomContentView>
            </Grid>
        </StackLayout>
    </ContentPage.Content>

CustomRenderer Android OnDraw

var element = this.Element;

            var frame = (Frame)element.Content.FindByName("clearFrame");

            int hPixel = (int)TypedValue.ApplyDimension(ComplexUnitType.Dip, (float)frame.Height, Context.Resources.DisplayMetrics);
            int wPixel = (int)TypedValue.ApplyDimension(ComplexUnitType.Dip, (float)frame.Width, Context.Resources.DisplayMetrics);

            int cPixel = (int)TypedValue.ApplyDimension(ComplexUnitType.Dip, (float)frame.CornerRadius, Context.Resources.DisplayMetrics);

            var rect = new Rect();
            this.GetDrawingRect(rect);

            var paint = new Paint()
            {
                Color = Android.Graphics.Color.Argb(115, 5, 5, 5),
                AntiAlias = true
            };

            canvas.DrawRect(new RectF(rect), paint);

            Rect innerRect = new Rect();
            this.GetDrawingRect(innerRect);

            var x = (innerRect.Right / 2) - (wPixel / 2);
            var y = (innerRect.Bottom / 2) - (hPixel / 2);
            var x2 = (innerRect.Right / 2) + (wPixel / 2);
            var y2 = (innerRect.Bottom / 2) + (hPixel / 2);

            innerRect.Bottom = y2;
            innerRect.Right = x;
            innerRect.Top = y;
            innerRect.Left = x2;


            var innerPaint = new Paint()
            {
                Color = Android.Graphics.Color.Transparent,
                AntiAlias = true
            };

            innerPaint.SetXfermode(new PorterDuffXfermode(PorterDuff.Mode.SrcOut));

            canvas.DrawRoundRect(new RectF(innerRect), (float)cPixel, (float)cPixel, innerPaint);

Я ожидаю правильно нарисованный прямоугольник в каждой ситуации, но как-то он действует довольно неожиданно

Я надеюсь, что мой плохой английский каким-то образом читается, если нет, я постараюсь объяснить это лучше.

Поздравления Хендрик

...