Evet, yapılabilir. Çok düz ileriye ve hatta sürdürülemez bir şekilde olmamasına rağmen.
Birincisi, (Xamarin Studio Meclisi Tarayıcı tarafından maruz gibi) en RadialProgressView
'ın çizim koduna biraz kazmak bakalım:
protected override void OnDraw(Canvas canvas)
{
// ... there's more stuff here, but you get the idea
canvas.DrawCircle(this.bgCx, this.bgCy, this.radius, this.bgCirclePaint);
canvas.DrawCircle(this.bgCx, this.bgCy, this.innerLineRadius, this.bgBorderPaint);
canvas.DrawText(this.valueText, this.textX, this.textY, this.textPaint);
}
Biz bgCirclePaint
ve bgBorderPaint
gibi, burada bazı renkler dikkat edin. Bu değişkenlerin değerini değiştirebilirsek, ProgressView'ın boyandığı rengi değiştirebiliriz.
Sorun, RadialProgressView
'un alanları göstermemesidir - hepsi özeldir, bu nedenle RadialProgressView
'dan miras alma, bunları yeni bir değere ayarlamamıza izin vermez.
Ancak, biz bu yüzden gibi bu özel alanlarını değiştirmek için reflection yararlanabilirler:
public class CustomizableRadialProgressView : RadialProgressView
{
public CustomizableRadialProgressView(Context context) : base(context)
{
}
public void SetTextColor(Color color)
{
var paint = new Paint();
paint.SetTypeface(Typeface.DefaultBold);
paint.Color = color;
paint.AntiAlias = true;
var textPaintMember = typeof(RadialProgressView).GetField("textPaint", BindingFlags.Instance | BindingFlags.NonPublic);
textPaintMember.SetValue(this, paint);
}
public void SetCircleColor(Color color)
{
var paint = new Paint();
paint.SetStyle(Paint.Style.Fill);
paint.Color = color;
paint.AntiAlias = true;
var circlePaintMember = typeof(RadialProgressView).GetField("bgCirclePaint", BindingFlags.Instance | BindingFlags.NonPublic);
circlePaintMember.SetValue(this, paint);
}
public void SetBorderColor(Color color)
{
var paint = new Paint();
paint.SetStyle(Paint.Style.Stroke);
paint.Color = color;
paint.AntiAlias = true;
var circlePaintMember = typeof(RadialProgressView).GetField("bgBorderPaint", BindingFlags.Instance | BindingFlags.NonPublic);
circlePaintMember.SetValue(this, paint);
}
public void SetProgressPackgroundColor(Color color)
{
var paint = new Paint();
paint.SetStyle(Paint.Style.Stroke);
paint.Color = color;
paint.AntiAlias = true;
var circlePaintMember = typeof(RadialProgressView).GetField("bgProgressPaint", BindingFlags.Instance | BindingFlags.NonPublic);
circlePaintMember.SetValue(this, paint);
}
}
:
var textPaintMember = typeof(RadialProgressView).GetField("textPaint", BindingFlags.Instance | BindingFlags.NonPublic);
textPaintMember.SetValue(Instance, MyNewSuperCoolColorPaint);
ikisini birleştirerek, böyle bir yeni, özelleştirilebilir sınıf ile gelebilir
Bu bizler bize sonuç alırsınız sonra:
Not: Özel alanların yanlış kullanıldığını fark etmek muhtemelen akıllıca olacaktır: Onları yaşadıkları sınıfın dışından manipüle ediyoruz. Xamarin asla RadialProgressView
'un uygulanış şeklini değiştirmeye karar verirse, hatta sadece isimleri değiştirirse Özel değişkenlerden biri, kodumuz çalışma zamanında başarısız olur. Bu soruna yaklaşmanın en iyi yolu muhtemelen Xamarin'in ihtiyacınız olan alıcıları/ayarlayıcıları sağlamasını istemek olacaktır. Ancak, hey, bu şekilde çok daha serin;)
Bunun için herhangi bir çözüm var mı? – SARATH
Maalesef Sarath'ı ben yapmadım. Mina'nın önerisini henüz denemedim, öyle ki bildiğim zaman sana haber vereceğim. – Zez3