【问题标题】:ScrollView bar Custom Renderer ColorScrollView bar 自定义渲染器颜色
【发布时间】:2020-12-03 12:09:19
【问题描述】:

尝试更改ScrollView 栏的颜色。我在这里找到了这个链接,但我更喜欢编写一个自定义渲染器,就像我使用所有其他控件一样:

Color of ScrollBar in ScrollView

问题是,我找不到任何对条形颜色有任何影响的属性/方法。到目前为止,这是我的尝试:

public class CustomScrollRenderer : ScrollViewRenderer
    {
        public CustomScrollRenderer(Context context) : base(context)
        {
        }

        protected override void OnElementChanged(VisualElementChangedEventArgs e)
        {
            base.OnElementChanged(e);

            this.ScrollBarSize = 50;
            this.ScrollBarDefaultDelayBeforeFade = 60000;
            
            this.SetBackgroundColor(Android.Graphics.Color.Red);
            this.SetOutlineAmbientShadowColor(Android.Graphics.Color.Red);
            this.SetOutlineSpotShadowColor(Android.Graphics.Color.Red);
            }
    }

【问题讨论】:

  • 为什么要创建自定义渲染只是为了更改属性而可以实现自定义效果?这是一个矫枉过正。 why-use-an-effect-over-a-custom-renderer
  • 我还在更改条形宽度和淡入淡出时间。该控件已经分散在我的 Xaml 中。不管是否矫枉过正,在我的自定义渲染器中更改颜色属性会非常方便。

标签: c# xamarin xamarin.forms custom-renderer


【解决方案1】:

在 iOS 中,你需要创建一个 UIScrollView 的子类并重写方法 LayoutSubviews

using Foundation;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using UIKit;

using App1;
using App1.iOS;
using Xamarin.Forms;
using Xamarin.Forms.Platform.iOS;
using ObjCRuntime;

[assembly:ExportRenderer(typeof(ScrollView),typeof(MyScrollViewRenderer))]
namespace App1.iOS
{
    public class MyScrollViewRenderer: ViewRenderer<ScrollView, UIScrollView>
    {
        protected override void OnElementChanged(ElementChangedEventArgs<ScrollView> e)
        {
            base.OnElementChanged(e);

            if(Control!=null)
            {
                SetNativeControl(new MyScrollView());
            }

        }
    }


    public class MyScrollView : UIScrollView
    {

        
        public override void LayoutSubviews()
        {

            foreach (UIView view in Subviews)
            {
                if (view.IsKindOfClass(new Class("UIImageView")))
                {
                    view.BackgroundColor = UIColor.Red;
                }
            }

            base.LayoutSubviews();
        }
    }
}

在安卓中

在资源中创建scrollbar_style -> 可绘制

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" >

  <gradient
      android:angle="45"
      android:centerColor="@color/blue"
      android:endColor="@color/blue"
      android:startColor="@color/blue" />

  <corners android:radius="8dp" />
</shape>
using Android.App;
using Android.Content;
using Android.Graphics.Drawables;
using Android.Graphics.Drawables.Shapes;
using Android.OS;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using App1.Droid;
using Java.Lang.Reflect;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Xamarin.Forms;
using Xamarin.Forms.Platform.Android;
using static Android.Icu.Text.DateFormat;
using Field = Java.Lang.Reflect.Field;

[assembly: ExportRenderer(typeof(Xamarin.Forms.ScrollView), typeof(MyScrollViewRenderer))]
namespace App1.Droid
{
    class MyScrollViewRenderer : ScrollViewRenderer
    {
        public MyScrollViewRenderer(Context context) : base(context)
        {
        }

        protected override void OnElementChanged(VisualElementChangedEventArgs e)
        {
            base.OnElementChanged(e);

            Field mScrollCacheField = Java.Lang.Class.FromType(typeof(Android.Views.View)).GetDeclaredField("mScrollCache");
            mScrollCacheField.Accessible = true;
            Java.Lang.Object mScrollCache = mScrollCacheField.Get(this); // scr is your Scroll View

            Field scrollBarField = mScrollCache.Class.GetDeclaredField("scrollBar");
            scrollBarField.Accessible = true;
            Java.Lang.Object scrollBar = scrollBarField.Get((Java.Lang.Object)mScrollCache);



            Method method = scrollBar.Class.GetDeclaredMethod("setVerticalThumbDrawable", Java.Lang.Class.FromType(typeof(Drawable)));
            method.Accessible = true;



            // Set your drawable here.
            method.Invoke(scrollBar, Resources.GetDrawable(Resource.Drawable.scrollbar_style));

        }

    }
}

【讨论】:

  • 谢谢,iOS 的答案将在我得到它时很有用。您提供的 android 链接看起来并不相关。
  • 你只需要改变key的值。
  • @LucasZhang-MSFT 如果您能像在 iOS 上一样分享适用于 Android 的工作示例,那就太好了。
  • 谢谢@LucasZhang-MSFT,我稍后再试试,非常感谢。
猜你喜欢
  • 2021-10-05
  • 2022-09-29
  • 1970-01-01
  • 2017-06-09
  • 1970-01-01
  • 2017-11-24
  • 2013-09-25
  • 2011-07-14
  • 1970-01-01
相关资源
最近更新 更多