gpt4 book ai didi

android - Frame OutlineColor 不适用于 Android、Xamarin Forms

转载 作者:行者123 更新时间:2023-11-29 15:37:07 27 4
gpt4 key购买 nike

我正在 Xamarin Forms 中开发应用程序,我遇到了一个应该在很久以前修复的错误。我尝试为框架设置轮廓,它在 ios 上运行良好,但在 android 上不起作用。

这是我的 Frame xaml。

<Frame
HasShadow="true"
CornerRadius="10"
OutlineColor="Red"
BackgroundColor="White">
<StackLayout
Orientation="Horizontal">
<Label
Text="TEST"
VerticalOptions="Center"/>
<Label
Text="For OUTLINE"
VerticalOptions="Center"/>
</StackLayout>
</Frame>

感谢您的帮助!

最佳答案

这不适用于安卓。已报告错误 here .

解决方案一:

您应该为 Android 平台的 Frame 创建一个 Renderer,如下所示:

using System;
using Android.Graphics.Drawables;
using Xamarin.Forms;
using Xamarin.Forms.Platform.Android;
using XFormsUI.Droid;

[assembly: ExportRenderer(typeof(Frame), typeof(RoundBorderFrameRenderer))]
namespace XFormsUI.Droid
{
public class RoundBorderFrameRenderer : FrameRenderer
{
protected override void OnElementChanged(ElementChangedEventArgs<Frame> e)
{
base.OnElementChanged(e);

if (e.NewElement != null && e.OldElement == null)
{
SetBackgroundResource(Resource.Drawable.round_border_frame);

//Write following lines if you want to bring the XAML Frame Elements's background Color into Native. Otherwise, Frame's BackgroundColor will not be effective.
GradientDrawable drawable = (GradientDrawable)Background;
string FrameBackgroundColorHex = String.Format("#{0:X2}{1:X2}{2:X2}", (int)(e.NewElement.BackgroundColor.R * 255), (int)(e.NewElement.BackgroundColor.G * 255), (int)(e.NewElement.BackgroundColor.B * 255));
drawable.SetColor(Android.Graphics.Color.ParseColor(FrameBackgroundColorHex));
}
}
}
}

这还需要一个 xml (round_border_frame.xml) 选择器文件。将此文件放在 Drawable 文件夹中。

<?xml version="1.0" encoding="UTF-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
<!--We need to give Frame's 'BorderColor Here-->
<stroke android:width="1dp" android:color="#FF0000" />
<corners android:radius="10dp" />
</shape>

解决方案 2:

使用不带选择器 xml 文件的 RendererSource .

using System;
using Android.Graphics;
using Xamarin.Forms;
using Xamarin.Forms.Platform.Android;
using XFormsUI.Droid;

[assembly: ExportRenderer(typeof(Frame), typeof(RoundBorderFrameRenderer))]
namespace XFormsUI.Droid
{
public class RoundBorderFrameRenderer : FrameRenderer
{
public override void Draw(Canvas canvas)
{
base.Draw(canvas);

using (var paint = new Paint { AntiAlias = true })
using (var path = new Path())
using (Path.Direction direction = Path.Direction.Cw)
using (Paint.Style style = Paint.Style.Stroke)
using (var rect = new RectF(0, 0, canvas.Width, canvas.Height))
{
float px = Forms.Context.ToPixels(Element != null ? Element.CornerRadius : 10); //Default Corner Radius = 10
float py = Forms.Context.ToPixels(Element != null ? Element.CornerRadius : 10); //Default Corner Radius = 10
path.AddRoundRect(rect, px, py, direction);

//Set the Width of the Border here
paint.StrokeWidth = 1f;
paint.SetStyle(style);

//Take OutLineColor from XAML Frame element and set it natively here.
string FrameBorderColorHex = String.Format("#{0:X2}{1:X2}{2:X2}", (int)(Element.OutlineColor.R * 255), (int)(Element.OutlineColor.G * 255), (int)(Element.OutlineColor.B * 255));
paint.Color = Android.Graphics.Color.ParseColor(FrameBorderColorHex);
canvas.DrawPath(path, paint);
}
}
}
}

解决方案 3:

但这不是最佳解决方案,但它是一种解决方法:将您的外部 Frame 包裹在另一个具有 PaddingFrame 中,并将其 BackgroundColor 设置为您的 Border Color 应该是什么。

注意:我还没有在 iOS 上检查过这个。

<Frame BackgroundColor="Red" CornerRadius="10" Padding="1,1,1,1">
<Frame CornerRadius="10" BackgroundColor="White">
<StackLayout Orientation="Horizontal">
<Label Text="TEST" VerticalOptions="Center" />
<Label Text="For OUTLINE" VerticalOptions="Center" />
</StackLayout>
</Frame>
</Frame>

人们正在讨论这个thread .

希望这会有所帮助!

关于android - Frame OutlineColor 不适用于 Android、Xamarin Forms,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47484760/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com