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で同様のものを作成すると、問題が発生します。誰かが何を見るべきか教えてもらえますか?良いコード例はありますか?これに似たものは見つかりませんでした。
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 を参照してください。
Xamarinフォームでボックスビューのシャドウ効果を得ることができました。フレームでも同様に使用できると確信しています。私は 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 Lollipopより前のバージョンでシャドウを表示する方法は見つかりませんでした。これによりアプリのクラッシュを防ぐことができます。
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
}
}
}