我的主要问题是一种ui刷新行为,它破坏了Xamarin.Forms(Android平台专用渲染器)在屏幕上的自定义绘图。
我绘制一个具有半透明黑色的矩形。该矩形为全屏尺寸。它继承了一个较小的矩形,该矩形具有位于customview顶部的框架的大小和角半径。 内部矩形使用Xfermode(PorterDuff.Mode)Src_Out绘制。结果是一个全屏矩形,内部有一个小矩形,完全透明。
这很好,但仅在特殊情况下使用。
当我只想绘制此customview时,我的ui会以我不希望的某种方式刷新。 完整的视图可以正确绘制,但是在0.5-1秒后,UI会刷新,小的透明矩形会以某种方式消失。
当我将这个customview放在stacklayout内,并在其上放置任何其他控件时,它不会在一段时间后刷新/消失。
我正在VS 19中使用Xamrin.Forms 4.1。 ContentPage包含一个ZXingQrCodeView和一些其他控件来显示文本和行为。
customview的类型为ContentView,它没有额外的可绑定属性。只是天真地使用它来使用“新” contentview。
这是我第二次尝试使用OnDraw绘制一个全新的视图,以xamarin格式,我具有丰富的知识,我试图将customview的类型更改为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);
我希望在每种情况下都能正确绘制矩形,但是某种程度上它出乎意料之外
我希望我的英语不好能以某种方式可读,否则我会尽力更好地解释它。
问候 亨德里克