Xamarin在Android框架上形成阴影

2sbarzqh  于 2023-09-28  发布在  Android
关注(0)|答案(3)|浏览(128)

Xamarin Forms中的Frame类非常有限,不能让我在Frame后面获得阴影。我使用以下代码为iOS制作了一个自定义渲染器:

public class RatingInfoFrameRenderer : FrameRenderer
{
    protected override void OnElementChanged(ElementChangedEventArgs<Frame> e)
    {
        base.OnElementChanged(e);

        Layer.BorderColor = UIColor.White.CGColor;
        Layer.CornerRadius = 10;
        Layer.MasksToBounds = false;
        Layer.ShadowOffset = new CGSize(-2, 2);
        Layer.ShadowRadius = 5;
        Layer.ShadowOpacity = 0.4f;
    }
}

在Android上做一个类似的是给我带来了问题,因为我对Android原生的知识是有限的。谁能告诉我该看些什么,也许是一些好的代码示例?我还没找到和这个相似的东西

uurv41yg

uurv41yg1#

在Android平台上可以很容易,但首先,你需要在Android资源的Drawable文件夹下创建你的影子。例如,如匿名贡献者在Android Developer Tips & Tricks中所示:

<?xml version="1.0" encoding="utf-8" ?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
  <item>
    <shape android:shape="rectangle">
      <solid android:color="#CABBBBBB" />
      <corners android:radius="2dp" />
    </shape>
  </item>

  <item
      android:left="0dp"
      android:right="0dp"
      android:top="0dp"
      android:bottom="2dp">
    <shape android:shape="rectangle">
      <solid android:color="@android:color/white" />
      <corners android:radius="2dp" />
    </shape>
  </item>
</layer-list>

将此文件命名为“shadow.xml”,并将其放置在Android项目的Drawable文件夹下,然后在您的RatingInfoFrameRenderer中:

public class RatingInfoFrameRenderer : FrameRenderer
{
    protected override void OnElementChanged(ElementChangedEventArgs<Frame> e)
    {
        base.OnElementChanged(e);
        if (e.NewElement != null)
        {
            ViewGroup.SetBackgroundResource(Resource.Drawable.shadow);
        }
    }
}

要改变shadow的样式,可以修改shadow.xml文件,关于这方面的更多信息,可以参考google的官方文档:LayerList。

swvgeqrz

swvgeqrz2#

我知道这个问题是老了,但有一个更新的方式获得更好的阴影效果,然后接受的答案。从Xamarin.Forms.Platform.Android.FastRenderers.FrameRenderer继承,然后使用SetOutlineSpotShadowColor(Color color)设置阴影颜色。您也可以使用CardElevation来确定阴影的强度和扩展。

[assembly: ExportRenderer(typeof(Myframe), typeof(MyFrameRenderer))]
namespace MyApp.Droid.Renderers
{
    public class MyFrameRenderer: Xamarin.Forms.Platform.Android.FastRenderers.FrameRenderer
    {
        public MyFrameRenderer(Context context) : base(context)
        {
        }

        protected override void OnElementChanged(ElementChangedEventArgs<Frame> e)
        {
            base.OnElementChanged(e);

            CardElevation = 10;

            if(((App)Application.Current).Theme != Core.Enums.Theme.Dark)
            {
                SetOutlineSpotShadowColor(Xamarin.Forms.Color.Gray.ToAndroid());
            }
            else
            {
                SetOutlineSpotShadowColor(Xamarin.Forms.Color.HotPink.ToAndroid());
            }
        }
    }
}

希望这能帮助像我一样在这里跌跌撞撞的人。

bvjxkvbb

bvjxkvbb3#

我能够在Xamarin Forms中为框视图获得阴影效果,我很确定它可以类似地用于Frame。我从Android文档中得到了线索
我添加了一个名为HasShadow的新属性

public static readonly BindableProperty HasShadowProperty =
            BindableProperty.Create("HasShadow", typeof(bool), typeof(ExtendedBoxView), false);

        public bool HasShadow
        {
            get { return (bool)GetValue(HasShadowProperty); }
            set { SetValue(HasShadowProperty, value); }
        }

下面是Android中渲染器的代码

public class ExtendedBoxViewRenderer : BoxRenderer
{
    protected override void OnElementChanged(ElementChangedEventArgs<BoxView> e)
    {
        base.OnElementChanged(e);
        var element = e.NewElement as ExtendedBoxView;

        if (element == null) return;

        if (element.HasShadow)
        {
            ViewGroup.Elevation = 8.0f;
            ViewGroup.TranslationZ = 10.0f;

        }

    }

}

这就是它的样子

更新

我发现这种方法会导致旧版本Android的应用程序崩溃。虽然我还没有找到一种方法来显示阴影在Android版本之前棒棒糖。这将防止任何应用程序崩溃

public class ExtendedBoxViewRenderer : BoxRenderer
    {
        protected override void OnElementChanged(ElementChangedEventArgs<BoxView> e)
        {
            base.OnElementChanged(e);
            var element = e.NewElement as ExtendedBoxView;

            if (element == null) return;

            if (element.HasShadow)
            {
//For some reason ViewCompat has issues when running in debug hence the workaround.
#if DEBUG
                double dAndroidVersion;
                if (double.TryParse(Build.VERSION.Release, out dAndroidVersion))
                {
                    if (dAndroidVersion < 21)
                        return;
                }
#else
                ViewCompat.SetElevation(ViewGroup, 8.0f);
                ViewCompat.SetTranslationZ(ViewGroup, 10.0f);
#endif
            }

        }

    }

相关问题