2012-11-15 25 views
10

Tôi có một SweepGradient định nghĩa làAndroid SweepGradient

circle_paint.setShader(new SweepGradient(getWidth()/2, getHeight()/2, new int[] { circle_start_color, circle_end_color}, new float[] { 0f, 1f})) 

áp dụng cho một vòm định nghĩa là

canvas.drawArc(circle_bounds, circle_start_perc*360f, circle_end_perc*360f, true, circle_paint); 

này workes tốt, nhưng tôi cần những vòm để bắt đầu vẽ từ phía trên cùng của màn hình, tức là

canvas.drawArc(circle_bounds, ((circle_start_perc*360f)-90f)%360, circle_end_perc*360f, true, circle_paint); 

Vấn đề là SweepGradient dường như vẫn bắt đầu ở 0 độ và tôi cần nó bắt đầu lúc 270 độ (tương tự như bản dịch được thực hiện trên bản vẽ cung tròn). Nói cách khác, nếu tôi có một gradient từ màu trắng sang màu xanh, tôi cần phần trên của hình cung được sơn màu trắng ở phần cuối cùng của hình cung được sơn màu xanh dương. Tôi có thể làm cái này như thế nào?

Trả lời

15

Bạn có thể thử sử dụng getLocalMatrix()setLocalMatrix() trên SweepGradient để áp dụng xoay vòng cho trình đổ bóng. Bạn có thể lấy Ma trận hiện tại, đăng vòng xoay thích hợp với postRotate() và sau đó đặt lại thành phần tử đổ bóng.

Một tùy chọn khác là xoay vòng Canvas. Bạn có thể xoay trước Canvas, vẽ nội dung và sau đó khôi phục nó; hoặc vẽ nội dung trước và sau đó xoay khung hình sau khi thực tế.

+1

Cảm ơn. Tôi chỉ xoay khung hình trước khi tôi vẽ vòm và khôi phục lại khung hình sau đó, làm việc như một nét duyên dáng :) – BOENDAGGER

+0

Xoay vòng là một gợi ý tuyệt vời. Làm giảm bạn phải làm những gì @BOENDAGGER đã làm với 'restore' /' restore'. Chỉ cần đặt xoay vòng đổ bóng một lần và bạn đã hoàn tất. – bcorso

8

Xoay nguồn gốc của SweepGradient sử dụng một Matrix.preRotate:

final int[] colors = {circle_start_color, circle_end_color}; 
final float[] positions = {0f, 1f}; 
Gradient gradient = new SweepGradient(circle_bounds.centerX(), circle_bounds.centerY(), colors, positions); 
float rotate = 270f; 
Matrix gradientMatrix = new Matrix();   
gradientMatrix.preRotate(rotate, circle_bounds.centerX(), circle_bounds.centerY()); 
gradient.setLocalMatrix(gradientMatrix); 
mPaint.setShader(gradient);