2016-12-02 12 views
9

Zrobiłem gradient odbarwiony za pomocą Lineargradienta z tym kodem: (Wiem, że to mogłoby być prostsze z Color.parseColor, ale to musi być w ten sposób, co zamierzam zrobić. rozciągliwej albo.)Lineargradient jest narysowany jako przesunięcie względem określonej pozycji

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

która produkuje ten wynik z lekko offsetted kolorów, zieleń jest zbyt mały i niebieski obszar jest zbyt duży w stosunku do oczekiwanego rezultatu.

comparison

Sprawdziłem wszystko. Próbowałem użyć new float[]{0f, 1/6f, 2/6f, 3/6f, 4/6f, 5/6f, 1f} zamiast null dla argumentu pozycji, ten sam wynik. To może być również błąd.

Należy pamiętać, że nie jest to duplikat this post ani this one. Chodzi o niepoprawne zatrzymania gradientu ustawione w kodzie, co nie jest moim przypadkiem. Może to być związane z this one, ale nie widzę sposobu.

EDYCJA: Może to można rozwiązać, ustawiając nierówne pozycje w kolorach, ale jak mogę obliczyć te dokładne pozycje?

+0

Szczerze mówiąc, jedyna różnica między faktycznym a oczekiwanym wydaje się być pewnym przesunięciem. – natario

+0

To właśnie próbuję rozwiązać i nie może to być spowodowane przez cokolwiek w moim kodzie poza tym, który podałem. –

+0

Tak, widzę. Co się stanie, jeśli użyjesz 0, 1, 1 jako ostatniego koloru, zamiast 360, 1, 1? – natario

Odpowiedz

3

Pracuję nad rozwiązaniem tego więcej niż 3 godziny w sumie i ... okazuje się, że to prawie nic. I to było w moim kodzie. Najgorsze jest to, że dodałem nagrodę i rozwiązałem ją 15 minut później.

narysowałem gradient w widoku z pewnym wyściółka i zamiast tego

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

musiałem to zrobić:

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

Jakoś gradient zaczyna się przed wypełnieniem I added to My view, at (0, 0), czyli 10-krotny minus od początku gradientu, powodujący przesunięcie.

enter image description here

To wszystko ma sens teraz.

Powiązane problemy