2016-12-02 27 views
9

Tôi đã tạo gradient với Lineargradient bằng mã này: (Tôi biết nó có thể đơn giản hơn với Color.parseColor nhưng nó phải là cách này cho những gì tôi định làm. có thể rút ra được.)Lineargradient được vẽ offset từ positon được chỉ định

colors = new int[]{ Color.HSVToColor(new float[]{0, 1, 1}), 
        Color.HSVToColor(new float[]{60, 1, 1}), 
        Color.HSVToColor(new float[]{120, 1, 1}), 
        Color.HSVToColor(new float[]{180, 1, 1}), 
        Color.HSVToColor(new float[]{240, 1, 1}), 
        Color.HSVToColor(new float[]{300, 1, 1}), 
        Color.HSVToColor(new float[]{360, 1, 1}) }; 
Shader shader = new LinearGradient(0, 0, width, 0, colors, null, Shader.TileMode.CLAMP); 
paint.setShader(shader); 

Sản xuất kết quả này với màu hơi lệch, diện tích xanh quá nhỏ và diện tích xanh quá lớn so với kết quả mong đợi.

comparison

Tôi đã kiểm tra mọi thứ. Tôi đã cố gắng sử dụng new float[]{0f, 1/6f, 2/6f, 3/6f, 4/6f, 5/6f, 1f} thay vì null cho đối số vị trí, cùng một kết quả. Điều này có thể là một lỗi quá.

Lưu ý rằng đây không phải là bản sao của this post cũng không phải this one. Đây là về các điểm dừng không chính xác được thiết lập trong mã mà không phải là trường hợp của tôi. Nó có thể liên quan đến this one nhưng tôi không thấy như thế nào.

EDIT: Có lẽ điều này có thể được giải quyết bằng cách đặt các vị trí không bằng nhau cho màu sắc, nhưng làm cách nào tôi có thể tính toán các vị trí chính xác này?

+0

Thành thật mà nói, sự khác biệt duy nhất giữa thực tế và dự kiến ​​có vẻ là một số bù đắp. – natario

+0

Đó là những gì tôi đang cố gắng giải quyết và nó không thể được gây ra bởi bất cứ điều gì trong mã của tôi bên ngoài một trong những tôi đã cung cấp. –

+0

Vâng, tôi hiểu rồi. Nếu bạn sử dụng 0, 1, 1 làm màu cuối cùng, thay vì 360, 1, 1 thì sao? – natario

Trả lời

3

Tôi đã làm việc để giải quyết điều này hơn 3 giờ trong tổng số và tốt ... hóa ra nó hầu như không có gì. Và nó nằm trong mã của tôi. Điều tồi tệ nhất là tôi đã thêm tiền thưởng và giải quyết nó sau 15 phút.

tôi vẽ gradient trong một cái nhìn với một đệm nhất định và thay vì điều này

LinearGradient(0, 0, width, 0, colors, null, Shader.TileMode.CLAMP); 

tôi phải làm điều này:

LinearGradient(left, 0, right, 0, colors, null, Shader.TileMode.CLAMP); 

Bằng cách nào đó gradient bắt đầu trước padding tôi thêm vào của tôi xem, tại (0, 0), đó là 10 dip bên trái của gradient bắt đầu của tôi, gây ra sự bù đắp.

enter image description here

Tất cả bây giờ đều có ý nghĩa.

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