Рамка не имеет эффекта тени ниже Android Q - PullRequest
0 голосов
/ 10 июля 2020

Я создал специальный рендерер для Frame, чтобы он выглядел как CardView в Android, он отлично работает на Android P, но я тестировал API 21,22,23, он не дает никакого эффекта. Вот мой Android Renderer.

public class ShadowFrameRenderer : Xamarin.Forms.Platform.Android.AppCompat.FrameRenderer
    {
        public ShadowFrameRenderer(Context context) : base(context)
        {
        }
        protected override void OnElementChanged(ElementChangedEventArgs<Frame> e)
        {
            base.OnElementChanged(e);
            if (e.NewElement != null && e.NewElement is ShadowFrame)
            {
                Elevation = 30.0f;
                TranslationZ = 0.0f;
                SetZ(30f);
                //this.SetBackgroundResource(Resource.Drawable.shadow);
                //GradientDrawable drawable = (GradientDrawable)this.Background;
                //drawable.SetColor(Android.Graphics.Color.ParseColor("#F0F0F0"));
            }
            UpdateElevation();
        }


        private void UpdateElevation()
        {
            //var materialFrame = (ShadowFrame)Element;

            // we need to reset the StateListAnimator to override the setting of Elevation on touch down and release.
            if(Android.OS.Build.VERSION.SdkInt >= Android.OS.BuildVersionCodes.Lollipop)
            Control.StateListAnimator = new Android.Animation.StateListAnimator();

            // set the elevation manually

                ViewCompat.SetElevation(this, 10);
                ViewCompat.SetElevation(Control, 10);
            if (Android.OS.Build.VERSION.SdkInt >= Android.OS.BuildVersionCodes.Lollipop)
            {
                Control.Elevation = 10;
                Control.CardElevation = 10;
            }

        }

        protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
        {
            base.OnElementPropertyChanged(sender, e);
            UpdateElevation();
            //if (e.PropertyName == "Elevation")
            //{
            //    UpdateElevation();
            //}
            }
}

Вот XAML.

<ContentPage.Content>
        <controls:ShadowFrame Padding="10" Margin="10">
        <Grid VerticalOptions="Start" HeightRequest="57" Margin="0,0,0,10" BackgroundColor="White">

                    <Grid ColumnSpacing="0" VerticalOptions="FillAndExpand">
                <StackLayout BackgroundColor="{DynamicResource PMedium}"
                                     x:Name="ListingLayoutB" VerticalOptions="FillAndExpand">
                    <Label Text="LISTING" HorizontalOptions="CenterAndExpand" TextColor="White" x:Name="ListingTxt"
                               FontSize="15" FontFamily="{StaticResource SBold}" VerticalOptions="CenterAndExpand"/>
                </StackLayout>

                <StackLayout Grid.Column="1" BackgroundColor="White"  x:Name="DealsLayoutB" VerticalOptions="FillAndExpand">
                    <Label Text="DEALS" HorizontalOptions="CenterAndExpand" TextColor="{DynamicResource PMedium}" x:Name="DealsTxt"
                               FontSize="15" VerticalOptions="CenterAndExpand" FontFamily="{StaticResource SBold}"/>
                </StackLayout>

            </Grid>
                      </Grid>
            </controls:ShadowFrame>
    </ContentPage.Content>

И вот результат кода выше. Снимок экрана взят из Android Emulator API level 23.

И вот результат кода выше. Снимок экрана взят из Android Emulator API level 23.

1 Ответ

0 голосов
/ 13 июля 2020

После установки BorderColor="White" тень отображается должным образом.

Источник: https://forums.xamarin.com/discussion/comment/416769#Comment_416769

...