2017-02-28 33 views
3

Xamarin Forms中的Frame类非常有限,并且不能让我在Frame后面获得阴影。我做了一个自定义的渲染器使用此代码的iOS:Xamarin在Android中构建Shadow on Frame

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原生的知识是一种有限的。任何人都可以告诉我要看什么,也许是一些很好的代码示例?我还没有发现任何与此类似的东西。

回答

4

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

<?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文件,关于这方面的更多信息,可以参考谷歌的官方文档:LayerList

+0

谢谢你,它的工作;) –

1

我能够在Xamarin Forms中获得阴影效果,我很确定它可以类似地用于框架。我从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的

 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 
      } 

     } 

    }