2015-07-14 22 views
5

Uygulamamdaki RadialProgress bileşenini (https://components.xamarin.com/view/radialprogress) uygulamaya çalışıyorum. Ekranda görüntü almayı başardım ve ilerleme rengini değiştirdim ancak çemberin iç rengini değiştirmenin bir yolunu bulamıyorum.Xamarin - Radyal İlerleme Bileşen Sorun

RadialProgressView nesnesinin kendisi bir DuffPorter.Mode alan bir BackgroundTintMode alanına sahiptir, ancak arka plan renk tonu modunu ayarladığım her defasında uygulama bu ileti ile kesilir (Message = "name = 'setBackgroundTintMode' imzası = '(Landroid/grafik/PorterDuff $ Modu;?!))

istediğimi yapmak için bile bir yolu var mı

Teşekkür

+0

Bunun için herhangi bir çözüm var mı? – SARATH

+0

Maalesef Sarath'ı ben yapmadım. Mina'nın önerisini henüz denemedim, öyle ki bildiğim zaman sana haber vereceğim. – Zez3

cevap

8

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:

2

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;)

+0

sadece merkez bölümünü değiştirebilir miyiz yüzük – SARATH

+0

@SarathiOS: Sorunuzu anladığımdan emin değilim. Hangi bölümü de değiştirmek istersiniz? –

+0

görünümünde, değiştirmek zorunda olduğum Etiketin (40) görünümü. Mümkün mü ? – SARATH

1
bir özel ViewRenderer uygulamayı deneyin ve altta yatan yerel Android görünümlerine erişebilir

Onları istediğiniz gibi değiştirin https://blog.xamarin.com/using-custom-controls-in-xamarin.forms-on-android/

siz "setBackgroundTintMode" yöntemiyle ilgili olarak sahip hata son API'ler kullanılabilir olduğundan emin olmak için Xamarin platformu güncellemeniz gerekebilir gösterir

+0

ios Uygulamamda bu radyal İlerleme Görünümü'nü uyguladım. Ama ne yazık ki arka planını değiştirmek için herhangi bir seçenek bulamadım. Iç alan.Ben Sen Radyal İlerleme görünümünün arka zemini değiştirmek için bir fikrin var – SARATH

+0

White'a arka planı değiştirin gerekir. Ben size bir ViewGroup için RadialProgressView döküm eğer Android'de, altta yatan bileşenlerine erişmek ve özelliklerini değiştirmek zorunda inanıyoruz peşin – SARATH

+0

yılında sayesinde, getChildAt (int indeks) yöntemiyle çocuk erişebilirler. –