在 Android 和 iOS 上点击自定义按钮时,实现“突出显示效果”而不是“涟漪效果”

Posted

技术标签:

【中文标题】在 Android 和 iOS 上点击自定义按钮时,实现“突出显示效果”而不是“涟漪效果”【英文标题】:Implementing the "highlight effect" instead of the "ripple effect" to a custom button when tapped on Android and iOS 【发布时间】:2021-07-19 05:43:24 【问题描述】:

我的Xamarin.Forms 应用程序中有一个自定义按钮,通过继承ContentView 类创建,并且我希望在此自定义视图时实现类似于ios 平台的“突出显示效果”(如图所示)被点击。

我知道,在 android 平台上,可以在自定义视图中实现 Android 特定的涟漪效果,方法是创建一个特定于自定义视图的自定义渲染器并将RippleDrawable 对象添加到本机控件,如下所示:

class CustomButtonRenderer
            : ViewRenderer
                <CustomButton,
                 Android.Views.View>
    
        public DescriptiveButtonRenderer(Context context)
                : base(context)
         

        protected override void OnElementChanged(ElementChangedEventArgs<CustomButton> e)
        
            LayoutInflater viewInflater;
            Android.Views.View view;
            GradientDrawable drawnBackground;
            StateListDrawable drawableStateList;
            RippleDrawable drawableRippleEffect;

            base.OnElementChanged(e);

            if (this.Control == null)
            
                // Implement the Android specific resource pertaining to
                // the Android specific XML layout of the custom button
                viewInflater = (LayoutInflater)this.Context
                                .GetSystemService(
                                  Context
                                    .LayoutInflaterService);
                view = viewInflater.Inflate
                                     (Resource.Layout.CustomButton,
                                     null,
                                     false);

                // For ripple effect
                drawnBackground = new GradientDrawable
                                   (GradientDrawable.Orientation.LeftRight,
                                    new int[] 
                                    this.Element.BackgroundColor.ToAndroid(),
                                    this.Element.BackgroundColor.ToAndroid()
                                    );
                drawableStateList = new StateListDrawable();
                drawableRippleEffect = new RippleDrawable
                                        (ColorStateList.ValueOf
                                            (Android.Graphics.Color.White),
                                         drawnBackground,
                                         null);
                drawableStateList.AddState
                                   (new int[] 
                                       Android.Resource
                                         .Attribute.StateEnabled ,
                                       drawableRippleEffect);
                view.Background = drawableStateList;

                this.SetNativeControl(view);
            
        
    

很遗憾,无法使用与上述解决方案类似的方法,因为 API 库中没有促进“突出显示效果”的类。

我还知道,在 Android 平台中,可以通过实现类似于下面的自定义渲染来从 Button 中移除波纹效果,该渲染将 null 值设置为原生的 StateListAnimator 属性控制如下:

class ButtonCustomRenderer
            : ButtonRenderer
    
        public ButtonCustomRenderer(Context context) : base(context)  

        protected override void OnElementChanged(ElementChangedEventArgs<Xamarin.Forms.Button> e)
        
            base.OnElementChanged(e);

            // Remove the ripple effect
            if (this.Control != null && e.NewElement != null)
            
                if (Build.VERSION.SdkInt > BuildVersionCodes.Lollipop)
                    this.Control.StateListAnimator = null;
                else
                    this.Control.Elevation = 0;
            
        
    

为了使用上述方法,我查看了与 Android.Animation.StateListAnimator 类型相关的内置动画师,但找不到任何满足要求的动画师。

我最初也是唯一的直觉是,当按下或点击视图时,手动将视图的背景颜色更改为“突出显示的颜色”,但我相信这不是一个优雅的方法解决方案,因为从自定义按钮的背景颜色模拟本机“突出显示颜色”非常费力。

提前致谢。

【问题讨论】:

【参考方案1】:

在 Android 中,您只需要使用选择器动画设置按钮背景。

在你的Resources/drawable中创建一个highlightbutton.xml

<?xml version="1.0" encoding="utf-8" ?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
   <!--press-->
   <item android:state_pressed="true" android:state_enabled="true">
     <shape >
       <solid android:color="#c00"/>
     </shape>
   </item>

   <!--normal-->
   <item android:state_pressed="false" android:state_enabled="false">
      <shape >
        <solid android:color="#f00"/>
      </shape>
   </item>
</selector>

然后在您的客户渲染器中:

class ButtonCustomRenderer
          : ButtonRenderer

    public ButtonCustomRenderer(Context context) : base(context)  

    protected override void OnElementChanged(ElementChangedEventArgs<Xamarin.Forms.Button> e)
    
        base.OnElementChanged(e);

        if (this.Control != null && e.NewElement != null)
        
            Control.SetBackgroundResource(Resource.Drawable.highlightbutton);
        
    

【讨论】:

以上是关于在 Android 和 iOS 上点击自定义按钮时,实现“突出显示效果”而不是“涟漪效果”的主要内容,如果未能解决你的问题,请参考以下文章

iOS 导航栏-返回按钮-自定义

用作自定义 UITableViewCell 的 XIB 中的自定义按钮不响应点击(ios7)

Android- 使用 EditText 帮助修复自定义警报对话框

Android:在自定义视图上使用android绑定点击事件

iOS - TableView - 在点击按钮上获取标题部分的索引

Android自定义控件3:带边框点击背景变色的textview,原型是支付宝手机充值中话费充值按钮