【问题标题】:CustomRenderer for Button background color transition用于按钮背景颜色转换的 CustomRenderer
【发布时间】:2018-05-10 14:03:39
【问题描述】:

我制作了一个自定义渲染器,用于在用户单击我的按钮时更改 TitleColorBackgroundColor

由于某种原因,当按钮获得焦点时,TitleColor 变得或多或少透明,并且我的背景不像我的TitleColor 那样具有动画效果。

这是我的代码:

public class BtnRendereriOS : ButtonRenderer
{

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


        if (Control != null)
        {
            Control.Layer.CornerRadius = 0;

            BackgroundNormalState(Control);            

            Control.TouchUpInside += (object sender, EventArgs c) =>
            {
                BackgroundNormalState(sender);
            };
            Control.TouchUpOutside += (object sender, EventArgs c) =>
            {
                BackgroundNormalState(sender);
            };
            Control.TouchDragOutside += (object sender, EventArgs c) =>
            {
                BackgroundNormalState(sender);
            };
            Control.TouchDragInside += (object sender, EventArgs c) =>
            {
                BackgroundChangedState(sender);
            };

            Control.TouchDown += (object sender, EventArgs c) =>
            {
                BackgroundChangedState(sender);
            };
            void BackgroundNormalState(object sender)
            {
                Action a = () => Control.SetTitleColor(UIColor.FromRGB(255,255,255), UIControlState.Normal);
                UIView.PerformWithoutAnimation(a); 

                (sender as UIButton).BackgroundColor = UIColor.FromRGB(3, 169, 244);

            }
            void BackgroundChangedState(object sender)
            {
                Action a = () => Control.SetTitleColor(UIColor.FromRGB(0,0,0), UIControlState.Highlighted);
                UIView.PerformWithoutAnimation(a);

                (sender as UIButton).BackgroundColor = UIColor.FromRGB(104, 206, 253);
            }
        }
    } 
}

目前,我已经从TitleColor 中删除了动画。

我的问题是:

  • 如何向我的BackgroundColor 添加与TitleColor 上的默认转换类似的相同转换?
  • 如何在按钮获得焦点时从TitleColor 中移除“透明度”?

【问题讨论】:

    标签: xamarin xamarin.forms xamarin.ios


    【解决方案1】:

    按钮时如何从 TitleColor 中删除“透明度” 正在集中注意力?

    这是系统按钮的特性,如果你不喜欢这个可以尝试使用自定义样式来避免它:

    UIButton btn = new UIButton(UIButtonType.Custom);
    btn.SetTitle(Control.TitleLabel.Text, UIControlState.Normal);
    SetNativeControl(btn);
    // Pay attention to that the title color just needs to be set once
    btn.SetTitleColor(UIColor.FromRGB(255, 255, 255), UIControlState.Normal);
    btn.SetTitleColor(UIColor.FromRGB(0, 0, 0), UIControlState.Highlighted);
    

    然后你可以使用UIView.Animate()通过“transition”来改变你按钮的背景颜色:

    void BackgroundNormalState(object sender)
    {
        UIView.Animate(0.2, () =>
        {
            (sender as UIButton).BackgroundColor = UIColor.FromRGB(3, 169, 244);
        });
    
    }
    void BackgroundChangedState(object sender)
    {
        UIView.Animate(0.2, () =>
        {
            (sender as UIButton).BackgroundColor = UIColor.FromRGB(104, 206, 253);
        });
    }
    

    【讨论】:

      【解决方案2】:

      您可以使用UIView.Animate|AsyncUIView.TransitionNotify|Async,具体取决于您要寻找的最终结果。关键是将所有更改放在同一个动画块中,以便它们通过 Core Animation (CA) 同时发生。

      这是一个使用UIView.TransitionNotifyAsync 的示例,在颜色变化之间使用TransitionCrossDissolve

      // Set intial values
      var normalTextColor = UIColor.FromRGB(255, 255, 255);
      var normalBackgroundColor = UIColor.FromRGB(3, 169, 244);
      var highlightTextColor = UIColor.Black;
      var highlightBackgroundColor = UIColor.FromRGB(104, 206, 253);
      Control.SetTitleColor(normalTextColor, UIControlState.Normal);
      Control.BackgroundColor = normalBackgroundColor;
      
      async Task NormalColorState(UIButton button)
      {
          await UIView.TransitionNotifyAsync(button, .25, UIViewAnimationOptions.TransitionCrossDissolve, () =>
          {
              button.BackgroundColor = normalBackgroundColor;
              button.SetTitleColor(normalTextColor, UIControlState.Normal);
          });
      }
      Control.TouchDown += async (object sender, EventArgs e) =>
      {
          var button = sender as UIButton;
          await UIView.TransitionNotifyAsync(button, .25, UIViewAnimationOptions.TransitionCrossDissolve, () =>
          {
              button.BackgroundColor = highlightBackgroundColor;
              button.SetTitleColor(highlightTextColor, UIControlState.Highlighted);
          });
      };
      Control.TouchUpInside += async (object sender, EventArgs e) =>
      {
          await NormalColorState(sender as UIButton);
      };
      Control.TouchUpOutside += async (object sender, EventArgs e) =>
      {
          await NormalColorState(sender as UIButton);
      };
      

      【讨论】:

        猜你喜欢
        • 2013-06-07
        • 2013-06-24
        • 2020-08-19
        • 2013-08-06
        • 2021-08-10
        • 2020-11-11
        • 2021-03-28
        • 1970-01-01
        • 2013-11-21
        相关资源
        最近更新 更多