Моя главная проблема - это своего рода поведение пользовательского интерфейса, которое разрушает мой пользовательский рисунок на экране в 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);
Я ожидаю правильно нарисованный прямоугольник в каждой ситуации, но как-то он действует довольно неожиданно
Я надеюсь, что мой плохой английский каким-то образом читается, если нет, я постараюсь объяснить это лучше.
Поздравления
Хендрик