2017-02-28 14 views
3

Die Frame-Klasse in Xamarin Forms ist ziemlich begrenzt und kann mir nicht erlauben, einen Schatten hinter dem Frame zu bekommen.Xamarin bildet Shadow on Frame in Android

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

ein ähnliches auf Android zu machen ist mir Probleme verursacht, da mein Wissen über Android nativer Art beschränkt ist: Ich habe einen benutzerdefinierten Renderer für iOS mit diesem Code gemacht. Kann mir jemand sagen, was ich mir ansehen soll, vielleicht ein gutes Codebeispiel? Ich habe nichts gefunden, was ähnlich aussieht.

Antwort

4

Es kann sehr einfach sein in Android-Plattform, aber vor allem müssen Sie Ihren Schatten unter Drawable Ordner von Android-Ressourcen erstellen. Zum Beispiel:

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

Benennen Sie diese Datei als „shadow.xml“ und es unter dem Drawable Ordner von Android-Projekt, dann in Ihrem RatingInfoFrameRenderer:

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

Um den Stil des Schattens, die Sie zu ändern Sie können die Datei shadow.xml ändern. Weitere Informationen hierzu finden Sie im offiziellen Dokument von Google: LayerList.

+0

Danke Mann, es hat funktioniert;) –

1

Ich konnte einen Schatteneffekt in Xamarin Forms für eine Box-Ansicht bekommen, ich bin mir ziemlich sicher, dass es ähnlich für einen Frame verwendet werden kann. Ich habe den Schlüssel von Android Documentation

ich eine neue Eigenschaft hinzugefügt HasShadow genannt

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

Hier ist der Code für den Renderer in 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; 


     } 

    } 

} 

Und das ist, wie es aussieht

UPDATE

Ich fand heraus, dass dieser Ansatz App-Absturz für ältere Versionen von Android verursacht. Obwohl ich keine Möglichkeit gefunden habe, Shadows in Android-Versionen vor Lollipop anzuzeigen. Dies wird verhindern, dass app Abstürze

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 
      } 

     } 

    }