OnDraw方法无法正常工作/ Xamarin.Forms

时间:2019-07-04 07:03:01

标签: c# xamarin.forms xamarin.android draw renderer

我的主要问题是一种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);

我希望在每种情况下都能正确绘制矩形,但是某种程度上它出乎意料之外

我希望我的英语不好能以某种方式可读,否则我会尽力更好地解释它。

问候 亨德里克

0 个答案:

没有答案