2011-10-15 19 views
7

trong Android Tôi muốn vẽ một PieChart với một số lượng động bánh nướng. Mỗi chiếc bánh phải có màu khác với gradient.Làm thế nào để có được một danh sách các màu sắc từ một gradient trên Android

Ví dụ: tôi muốn có độ dốc từ nâu nhạt đến nâu đậm. Nếu tôi cần phải vẽ năm chiếc bánh, tôi cần năm volors từ đầu đến cuối của gradient này.

Tôi có thể làm điều đó trong Java bằng khung công tác Android như thế nào?

tôi phát hiện ra rằng tôi có thể tạo một Gradient Linear cho một dòng, ví dụ:

LinearGradient lg = new LinearGradient(1, 1, 5, 5, toRGB("lightbrown"), toRGB("darkbrown"), TileMode.REPEAT); 

Nhưng tôi đã không tìm thấy bất kỳ chức năng để có được một màu sắc từ dòng này, ví dụ:

// for the five needed RGB colors from the gradient line 
lg.getRGBColor(1, 1); 
lg.getRGBColor(2, 2); 
lg.getRGBColor(3, 3); 
lg.getRGBColor(4, 4); 
lg.getRGBColor(5, 5); 

Bạn có bất kỳ ý tưởng làm thế nào tôi có thể nhận được điều này?

Cảm ơn!

Trả lời

16

Bạn không thể nhận các giá trị này trực tiếp từ LinearGradient. Gradient không chứa bản vẽ thực tế. Để có được các giá trị này, bạn có thể vẽ chúng vào một khung vẽ và kéo các màu ra khỏi khung vẽ, hoặc những gì tôi đề nghị sẽ là tự tính các giá trị.

Đó là độ dốc tuyến tính lặp lại trong năm bước và bạn có giá trị RGB cho màu đầu tiên và màu cuối cùng. Phần còn lại chỉ là toán học. Đây là mã giả:

int r1 = startColor.red; 
int g1 = startColor.green; 
int b1 = startColor.blue; 

int r2 = endColor.red; 
int g2 = endColor.green; 
int b2 = endColor.blue; 

int redStep = r2 - r1/4; 
int greenStep = g2 - g1/4; 
int blueStep = b2 - b1/4; 

firstColor = new Color(r1, g1, b1); 
secondColor = new Color(r1 + redStep, g1 + greenStep, b1 + blueStep); 
thirdColor = new Color(r1 + redStep * 2, g1 + greenStep * 2, b1 + blueStep * 2); 
fourthColor = new Color(r1 + redStep * 3, g1 + greenStep * 3, b1 + blueStep * 3); 
fifthColor = new Color(r1 + redStep * 4, g1 + greenStep * 4, b1 + blueStep * 4); 
+0

Rất tốt. Ý tưởng đơn giản và giải pháp làm việc! Cảm ơn bạn – treimy

+0

Cảm ơn bạn vì ý tưởng đơn giản và tuyệt vời này! – Gatekeeper

3

Một cách tiếp cận khác có thể tái sử dụng được nhiều hơn (dường như luôn gặp vấn đề này). Đó là một chút mã. Dưới đây là cách sử dụng:

int[] colors = {toRGB("lightbrown"), toRGB("darkbrown")};//assuming toRGB : String -> Int 
    float[] positions = {1, 5}; 
    getColorFromGradient(colors, positions, 1) 
    //... 
    getColorFromGradient(colors, positions, 5) 

Hỗ trợ chức năng

public static int getColorFromGradient(int[] colors, float[] positions, float v){ 

    if(colors.length == 0 || colors.length != positions.length){ 
     throw new IllegalArgumentException(); 
    } 

    if(colors.length == 1){ 
     return colors[0]; 
    } 

    if(v <= positions[0]) { 
     return colors[0]; 
    } 

    if(v >= positions[positions.length-1]) { 
     return colors[positions.length-1]; 
    } 

    for(int i = 1; i < positions.length; ++i){ 
     if(v <= positions[i]){ 
      float t = (v - positions[i-1])/(positions[i] - positions[i-1]); 
      return lerpColor(colors[i-1], colors[i], t); 
     } 
    } 

    //should never make it here 
    throw new RuntimeException(); 
} 

public static int lerpColor(int colorA, int colorB, float t){ 
    int alpha = (int)Math.floor(Color.alpha(colorA) * (1 - t) + Color.alpha(colorB) * t); 
    int red = (int)Math.floor(Color.red(colorA) * (1 - t) + Color.red(colorB) * t); 
    int green = (int)Math.floor(Color.green(colorA) * (1 - t) + Color.green(colorB) * t); 
    int blue = (int)Math.floor(Color.blue(colorA) * (1 - t) + Color.blue(colorB) * t); 

    return Color.argb(alpha, red, green, blue); 
} 
+0

hữu ích cho calucalation động – Godwin

Các vấn đề liên quan