Android rant #2 – RatingBar

В едно приложение ми се налага да показвам графично изчислен score от някаква формула. Тъй като оценката е тип колкото по-голяма стойност толкова по-хубаво, ми се стори добра идея да показвам резултата като звездички. Сетих се, че съм виждал в палитрата такъв компонент и го намерих – ratingbar. Стори ми се точно каквото търся. Има звездички, които са или пълни или празни, въбще нещо като ProgressBar, но с custom фон. Има свойства за гранулярност, за максимален брой звездички, за текуща стойност и т.н. Когато обаче го пуснах в емулатора на portrait ориентация на телефон се оказа, че се виждат само 3-4 звездички. Затова намерих някакъв tutorial и сложих custom изображения за пълна и празна звездичка, които да са значително по-малки. И се оказа, че всъщност както и да го въртиш, ProgressBar-ът показва толкова звездички колкото може да разположи на наличното пространство. Всъщност изглежда принципът е, че поставя първо празните звездички колкото пъти се събират (включително може да са отрязани, което е грозно само по себе си), после поставя отгоре изображение с пълните колкото пъти се събират. Тоест две съставни изображения от повтарящ се мотив се монтират едно върху друго, като горното е толкова широко, колкото е зададената стойност съотнесена към физическият размер. Така се получават частите от цяла стойност. Но в резултат изобщо не може да се гарантира точният брой звездички, които се показват. Ако искате да покажете стойност 5 от максимално 10 звезди, а на екрана се събират само 6, ще бъдат запълнени 3. Което явно им се е сторило много хитро, но всъщност не е. Защото по този начин променяме базата. Едно е 5/10, друго е 1.5/3. Представете си ако приложението на imdb беше направено по този начин, ако го отворите в portrait ориентация на телефон ще трябва да оценявате филмите максимум от 4 звезди, въпреки че тяхната база е x/10. Така че не открих хубав начин да се оправя и за да имам гарантирани точно 10 звезди показани, ще трябва да направя примерно 30 изображения с всички възможни комбинации с точност до 0.3 и просто да сменям съответното изображение. Дървено, но по-добре работещо от направеното от Google. Защо някои са писали blog постове, в които възхвалят този компонент е beyond me, наистина.
Edit: Ето добро описание с картинки на проблема: http://stackoverflow.com/questions/12454644/android-ratingbar-a-complete-mess?rq=1

Leave a comment

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.