如何移除Xamarin.Forms中HoloCircularProgressBar的方形标记
解决Xamarin.Forms安卓自定义进度条起始方形标记问题
我之前也折腾过这个自定义进度条的坑,刚好能给你点实用的解决思路!你提到用IsMarkerEnabled只去掉了起始标记点,但还有残留的方形标记,大概率是因为默认的ProgressBar Drawable或者自定义控件的绘制逻辑里还保留了相关代码,咱们一步步来解决:
1. 排查自定义ProgressBar的绘制逻辑
如果你是跟着那篇文章实现的自定义安卓ProgressBar,先去检查它的OnDraw方法(或者对应的绘制代码)。有些版本的示例里会额外绘制一个起始方块,哪怕IsMarkerEnabled设为false,可能还有漏网的代码。比如类似这样的:
// 假设是C#的自定义ProgressBar类 protected override void OnDraw(Canvas canvas) { base.OnDraw(canvas); if (IsMarkerEnabled) { // 这里就是绘制起始方形标记的代码 canvas.DrawRect(0, 0, MarkerWidth, Height, MarkerPaint); } }
如果有这段,要么确保IsMarkerEnabled确实被设为false,要么直接把这段绘制标记的代码删掉,从根源上移除标记。
2. 替换默认的ProgressDrawable
原生ProgressBar的默认Drawable可能自带一些样式标记,哪怕禁用了IsMarkerEnabled,也可能残留视觉元素。咱们可以直接替换成完全自定义的Drawable,彻底控制进度条的外观:
在Xamarin.Forms的自定义渲染器里,添加这段代码:
protected override void OnElementChanged(ElementChangedEventArgs<Xamarin.Forms.ProgressBar> e) { base.OnElementChanged(e); if (Control == null) return; // 先禁用标记 Control.IsMarkerEnabled = false; // 创建自定义背景和进度层 var backgroundShape = new ShapeDrawable(new RectShape()); backgroundShape.Paint.Color = Android.Graphics.Color.LightGray; // 背景色 var progressShape = new ShapeDrawable(new RectShape()); progressShape.Paint.Color = Android.Graphics.Color.Blue; // 进度颜色 // 组合成LayerDrawable var layerDrawable = new LayerDrawable(new Drawable[] { backgroundShape, progressShape }); layerDrawable.SetId(0, Android.Resource.Id.Background); layerDrawable.SetId(1, Android.Resource.Id.Progress); // 替换默认的Drawable Control.ProgressDrawable = layerDrawable; }
这样进度条就会变成纯矩形的样式,完全没有多余的标记。
3. 检查原生样式影响
如果上面两步还没解决,可能是你给ProgressBar设置了原生安卓的样式,有些系统样式默认带标记。可以尝试在渲染器里设置一个不带标记的基础样式:
Control.SetStyle(Android.Resource.Style.Widget_Holo_ProgressBar_Horizontal, null);
再配合前面的Drawable替换,应该就能彻底解决问题了。
内容的提问来源于stack exchange,提问作者Himanshu Dwivedi
相关产品推荐
相关产品推荐

