我尝试创建一个 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 :
您可以使用插件:有色图像并添加单击事件来实现相同的功能。
- 安装
Plugin.CrossPlatformTintedImage
nuget 包
在 iOS、Android 和 UWP 项目中初始化渲染器,如下所示:
Xamarin.Forms.Init(); TintedImageRenderer.Init();
在 Xaml 中:
<ContentPage ... xmlns:controls="clr-namespace:Plugin.CrossPlatformTintedImage.Abstractions;assembly=Plugin.CrossPlatformTintedImage.Abstractions" ...> ... <controls:TintedImage x:Name="buttonImage" TintColor="Blue" Source="redDis.png"/> ... </ContentPage>
在代码中,添加点击手势手势识别器:
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)
不确定是否需要使用图像按钮而不是简单的按钮。