首页 文章

Xamarin在Android中在Frame上形成Shadow

提问于
浏览
7

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原生的知识有限 . 谁能告诉我要看什么,也许是一些很好的代码示例?我还没有找到任何与此类似的东西 .

2 回答

  • 1

    在Android平台上它可以很容易,但首先,你需要在Android资源的 Drawable 文件夹下创建你的影子 . 例如:

    <?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.xml文件,有关此内容的更多信息,请参阅google的官方文档:LayerList .

  • 9

    我能够在Xamarin Forms中获得阴影效果以获得盒子视图,我很确定它可以类似地用于Frame . 我从Android Documentation得到了线索

    我添加了一个名为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中Renderer的代码

    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;
    
    
            }
    
        }
    
    }
    

    这就是它的样子

    UPDATE

    我发现这种方法导致旧版Android的应用程序崩溃 . 虽然我还没有找到在Lollipop之前在Android版本中显示Shadows的方法 . 这可以防止任何应用程序崩溃

    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
                }
    
            }
    
        }
    

相关问题