图像色调按钮 Android Xamarin Forms



我尝试创建一个 CustomRenderer for Android 继承到 ButtonRenderer 与图像。我想像在iOS上一样以编程方式更改图像的颜色TintColor

例如,我的自定义渲染器 iOS:

public class IconButtonRenderer : ButtonRenderer
{
protected override void OnElementChanged(ElementChangedEventArgs<Button> e)
{
base.OnElementChanged(e);
var button = e.NewElement;
}
public override void Draw(CoreGraphics.CGRect rect)
{
base.Draw(rect);
// Here I change color of Image in Red.
Control.ImageView.Image = Control.ImageView.Image.ImageWithRenderingMode(UIImageRenderingMode.AlwaysTemplate);
Control.ImageView.TintColor = UIColor.Red;
}

}

在安卓上:Control是一个Android.Widget.Button,没有图像属性,但Xamarin.Forms.Button具有属性图像和使用Android.Widget.Button适用于Android。

如何使用Android格式访问图像以更改颜色?

图像色调按钮 安卓 Xamarin Forms

原始图像

解决方案 1 :

正如@Mathias Kirkegaard所说,在你的ButtonRenderer中,你可以使用SetColorFilter来改变颜色:

Control.Background.SetColorFilter(Android.Graphics.Color.Blue, PorterDuff.Mode.SrcIn);

它确实可以在原生Android中工作,但在Xamarin.Forms中存在一些问题,它只更改Button背景颜色,如下所示:效果。希望有人能找到解决方案,如果我找到解决此问题的解决方案,我会回来更新我的答案。

解决方案 2 :

您可以使用插件:有色图像并添加单击事件来实现相同的功能。

  1. 安装Plugin.CrossPlatformTintedImagenuget 包
  2. iOS、Android 和 UWP 项目中初始化渲染器,如下所示:

    Xamarin.Forms.Init();    
    TintedImageRenderer.Init();
    
  3. 在 Xaml 中:

    <ContentPage 
    ...
    xmlns:controls="clr-namespace:Plugin.CrossPlatformTintedImage.Abstractions;assembly=Plugin.CrossPlatformTintedImage.Abstractions"
    ...>
    ...
    <controls:TintedImage x:Name="buttonImage" TintColor="Blue" Source="redDis.png"/>
    ...
    </ContentPage>
    
  4. 在代码中,添加点击手势手势识别器:

    var tapGestureRecognizer = new TapGestureRecognizer();
    tapGestureRecognizer.Tapped += (s, e) => 
    {
    // handle the tap
    };
    buttonImage.GestureRecognizers.Add(tapGestureRecognizer);
    

在着色图像上添加点击事件后的效果

解决方案 3 :

如果您需要使用ImageButton,您可以参考此解决方案。我没有测试它,但你可以使用XLab的ImageButton。

  • XLab 图像按钮源代码

  • XLab ImageButtonRenderer 源代码

在按钮上,您可以使用"SetColorFilter(color)">

您可以使用 ContextCompat 获取颜色:

var color = new Color(ContextCompat.GetColor(Context, Resource.Color.Green));

然后应用它:

yourButton.SetColorFilter(color)

不确定是否需要使用图像按钮而不是简单的按钮。

最新更新