Eu acho que você tem que criar o seu próprio bar classificação personalizada se você quiser fazer isso
Donal Rafferty
Eu escrevi um post descrevendo como alterar imagens RatingBar: kozyr.zydako.net/2010/05/23/pretty-ratingbar Ele também mostra onde você pode especificar o tamanho da imagem ...
Kozyr
Eu esperava que esta pergunta fosse para barra de classificação multicolorida, como mostrado em sites, não consegui encontrar uma para mim. Eu mesmo criei uma implementação simples github.com/codebreaker/coloredratingbar-android . Espero que isto seja útil a alguém.
Jaga6
Respostas:
26
Etapa 1: Crie seu próprio estilo, clonando um dos estilos existentes (de $ANDROID_HOME/platforms/$SDK/data/res/values/styles.xml), colocando-o no seu próprio projeto styles.xmle fazendo referência a ele quando você adiciona o widget a um layout.
Etapa 2: crie seus próprios LayerDrawablerecursos XML para o RatingBar, apontando para as imagens apropriadas a serem usadas na barra. Os estilos originais apontarão para os recursos existentes com os quais você pode comparar. Em seguida, ajuste seu estilo para usar seus próprios LayerDrawablerecursos, em vez dos recursos internos.
Conforme a etapa 2, isso não funciona para dispositivos Samsung 3 ou alguns outros, não é necessário ser um LayerDrawable. Veja aqui para informações: stackoverflow.com/questions/30266334/…
Kenny
6
Use android: progressTint = "@ color / yellow". Veja a resposta de @superpuccio.
Vincent
2
progressTint suportado apenas acima do nível 21 api
É um pouco complicado no blog mencionado, usei uma maneira semelhante, mas mais simples. Você precisa de imagens de 3 estrelas (red_star_full.png, red_star_half.png e red_star_empty.png) e um xml, só isso.
Oi Alex, eu tentei esta solução, mas quando tento definir a classificação para algo como 1.1, 1.2, etc ... é exibido como 1.5. Eu tirei imagens de três estrelas, uma vazia, uma metade cheia e uma cheia. Eu presumo que é suposto interpolar entre eles para obter os componentes fracionários, só estou me perguntando se alguém mais teve o mesmo problema ou estou fazendo algo visivelmente errado?
Graham Baitson
Você pode por favor me dizer sobre as imagens que devemos usar o tempo suas imagens e tamanho das imagens coloridas de im não capaz de resolver isso ...
Prithviraj Shiroor
1
Todo mundo vê a resposta da atualização de 2015 abaixo! É muito mais fácil e mais simples!
21815 katie
Essa resposta ainda oferece mais flexibilidade sobre os diferentes estados das estrelas.
Tom Brinkkemper
Por que estou recebendo linhas verticais abaixo das estrelas? Tentei definir o estilo personalizado, especificando a altura, mas ainda há linhas verticais abaixo das estrelas no meu AVD.
O que exatamente PorterDuff.Mode.SRC_ATOPsignifica ou faz?
Zapnologica
5
Não funciona na API 5.0 e superior. Precisa:Drawable stars = rb.getProgressDrawable(); stars.setTint( Color.YELLOW );
zyamys
@zyamys Esta realmente é uma porcaria = (método A para "versões superiores" e um outro método para versões mais antigas é necessário?
Daniela Morais
1
Funciona apenas para uma precisão de 0,5. Caso contrário (precisão <0,5) a sobreposição fica estranho e parece que a cor azul ainda está com uma precisão de 0,5, enquanto o amarelo é preciso
Teo Inke
1
Aviso: falha em dispositivos pré-lolipop. Vá com a resposta aceita.
blockwala
70
A maneira mais fácil que funcionou para mim ... se você estiver estendendo a Atividade AppCompat
Em seu build.gradle, adicione a biblioteca appcompat mais recente.
dependencies {
compile 'com.android.support:appcompat-v7:X.X.X'// where X.X.X version}
Faça sua atividade estender android.support.v7.app.AppCompatActivity
Obrigado @Vishal Kumar. Eu tentei no Kitkat 4.4.4 (Samsung S3 neo) e Marshmallow 6.0.1 (Samsung Galaxy On Nxt), funcionou. Mas não houve sucesso no Lollipop 5.1 (Micromax). Para o Lollipop, usei o atributo "android: progressTint" no RatingBar e, sim, ele funciona.
Prashant
Essa é a melhor solução.
Arhat Baid
Essa deve ser a resposta correta selecionada.
Hampel Előd 29/11
1
essa é a melhor solução. Se você quiser alterar o tamanho da estrela, poderá usar style="?android:ratingBarStyleSmall"juntos.
André Luiz Reis
@ AndréLuizReis <style name="RatingBarSmallTheme" parent="Theme.AppCompat"> <item name="colorControlNormal">@color/colorOrangeNormal</item> <item name="colorControlActivated">@color/colorOrangeActivated</item> <item name="ratingBarStyle">@style/Widget.AppCompat.RatingBar.Small</item> </style> e sua classificaçãoBar android:theme="@style/RatingBarSmallTheme"
Zakhar Rodionov
47
Atualização de 2015
Agora você pode usar DrawableCompat para colorir todos os tipos de drawables. Por exemplo:
Existe alguma maneira de definir a cor das estrelas com base nos dados buscados no banco de dados? Digamos que eu tenho 5 estrelas e os dados retornados do banco de dados foi 4. Então, ao invés de mudar todos os 5, eu só alterar o primeiro 4
1
getColor está obsoleto agora, alguma alternativa?
Manohar Reddy
2
Você pode encontrar respostas aqui stackoverflow.com/a/32202256/2513291 Por exemplo, este ContextCompat.getColor abordagem (contexto, R.color.color_name)
Yuriy Vinogradov
funciona bem, mas observe que, por algum motivo, a ordem é importante (2, depois 1 e depois 0). Eu tentei o inverso e isso levou a algumas falhas na interface do usuário na primeira vez que a cor foi alterada.
Simon Ninon
25
As soluções que Alex e CommonsWares publicaram estão corretas. Uma coisa sobre a qual o Android nunca fala é sobre tamanhos de pixels adequados para diferentes densidades. Aqui estão as dimensões necessárias para cada densidade com base na luz halo.
Então, eu estou lutando com esse problema há duas horas e criei uma solução funcional para todas as versões da API, onde também são mostradas classificações de meia estrela.
a única maneira que funciona para mim no API19, mas eu não desisti de procurar uma maneira de fazer isso a partir de xml única T_T
Beeing Jk
@BeeingJk Se você criar uma exibição personalizada que estenda a RatingBar, poderá criar seus próprios atributos xml para especificar a cor da tonalidade. Você tem um único ponto de controle para definir a tonalidade e pode especificar a tonalidade em xml. Espero que ajude! Pode explicar mais se necessário
Forrest Bice
Mode.SRC_INou Mode.MULTIPLY?
Dr.jacky
12
Agora você pode usar o DrawableCompat a partir do AppCompat v22.1.0 para colorir dinamicamente todos os tipos de drawables, úteis quando você oferece suporte a vários temas com um único conjunto de drawables. Por exemplo:
LayerDrawable layerDrawable =(LayerDrawable) ratingBar.getProgressDrawable();DrawableCompat.setTint(DrawableCompat.wrap(layerDrawable.getDrawable(0)),Color.RED);// Empty starDrawableCompat.setTint(DrawableCompat.wrap(layerDrawable.getDrawable(1)),Color.GREEN);// Partial starDrawableCompat.setTint(DrawableCompat.wrap(layerDrawable.getDrawable(2)),Color.BLUE);// Full star
Isso é compatível com a API 4. Consulte também a publicação no blog de Chris Banes em Support Libraries v22.1.0
Para o tamanho e a forma reais, você precisará definir um novo estilo e drawables de lista de camadas para o tamanho apropriado, como outros já responderam acima.
Agora você pode usar DrawableCompat para colorir todos os tipos de drawables. Por exemplo:
Progresso desenhável = ratingBar.getProgressDrawable (); DrawableCompat.setTint (progress, Color.WHITE); Isso é compatível com versões anteriores até API 4
Depois de algumas pesquisas, desenvolvi esse método para definir a tonalidade de fundo, a diferença de espaço (ex: meia estrela) e a cor da tonalidade da estrela.
LayerDrawable layers =(LayerDrawable) ratingBar.getProgressDrawable();DrawableCompat.setTint(layers.getDrawable(0),0x33000000);// The background tintDrawableCompat.setTint(layers.getDrawable(1),0x00000000);// The gap tint (Transparent in this case so the gap doesnt seem darker than the background)DrawableCompat.setTint(layers.getDrawable(2),0xffFED80A);// The star tint
Usando as respostas acima, criei um método estático rápido que pode ser facilmente reutilizado. Ele visa apenas colorir a cor do progresso das estrelas ativadas. As estrelas que não são ativadas permanecem cinza.
Basta passar sua barra de classificação e uma cor usando getResources().getColor(R.color.my_rating_color)
Como você pode ver, eu uso o DrawableCompat, por isso é compatível com versões anteriores.
EDIT: Este método não funciona na API21 (veja o porquê). Você acaba com um NullPointerException ao chamar setProgressBar. Acabei desativando todo o método na API> = 21.
java.lang.ClassCastException: android.support.v4.graphics.drawable.DrawableWrapperHoneycomb não pode ser convertido para android.graphics.drawable.LayerDrawable na pré-pirulito
Ishaan Garg
1
@IshaanGarg você está certo. Corri para o mesmo problema e atualizei meu método. Atualizei meu código para lidar com o caso. Eu não acho que é uma questão de versão para Android. Se você usar a versão menor da barra de classificação (com style = "? Android: attr / ratingBarStyleSmall"), o drawable retornado ainda será um LayoutDrawable.
JDenais
Sim, exatamente o que eu havia implementado, não deixe de usar AppCompatRatingBar. Embora eu não seja capaz de obter meia estrela ao pré-definir a classificação em XML / java. Classificação (3,5) mostra 4 estrelas completas
Ishaan Garg
1
A barra de classificação é usada automaticamente no tempo de execução para alterar a cor na estrela de toque.
Primeiro adicione estilo no arquivo app \ src \ main \ res \ values \ styles.xml:
Você está certo. Eu não sei por que eu estava pensando que ele tinha problemas para mudar a cor da borda da estrela (talvez porque se eu tivesse o problema). Sua resposta é mais completa.
Pau Arlandis Martinez
0
Eu estava procurando por um método confiável para fazer isso até a API 9, pelo menos. A solução "transmitir para LayerDrawble" parecia uma solução arriscada para mim e, quando o testei em um telefone Android no 2.3, foi transmitida com sucesso, mas a chamada para DrawableCompat.setTint (...) não teve nenhum efeito.
A necessidade de carregar recursos extraíveis também não me pareceu uma boa solução.
Decidi codificar minha própria solução, que é uma classe que estende AppCompatRatingBar, usando um Drawable personalizado, cuidando de desenhar as estrelas programaticamente. Funciona perfeitamente para as minhas necessidades, postarei caso ajude alguém:
O link é mais fácil porque você pode obter o arquivo completo diretamente, mas aqui está o código completo, apenas no caso de:
import android.content.Context;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.ColorFilter;import android.graphics.Paint;import android.graphics.Paint.Style;import android.graphics.Path;import android.graphics.PointF;import android.graphics.drawable.Drawable;import android.support.v7.widget.AppCompatRatingBar;import android.util.AttributeSet;/**
* @author androidseb
* <p/>
* Extends AppCompatRatingBar with the ability to tint the drawn stars when selected, pressed and un-selected.
* Limitation: Only draws full stars.
*/publicclassTintableRatingBarextendsAppCompatRatingBar{privateTintableRatingBarProgressDrawable progressDrawable;publicTintableRatingBar(finalContext context){super(context);
init();}publicTintableRatingBar(finalContext context,finalAttributeSet attrs){super(context, attrs);
init();}publicTintableRatingBar(finalContext context,finalAttributeSet attrs,finalint defStyleAttr){super(context, attrs, defStyleAttr);
init();}privatevoid init(){
progressDrawable =newTintableRatingBarProgressDrawable();
setProgressDrawable(progressDrawable);}publicvoid setCustomTintColors(finalint _uncheckedColor,finalint _pressedColor,finalint _checkedColor){
progressDrawable.setRatingMaxLevelValue(getMax()*1000);
progressDrawable.setUnCheckedColor(_uncheckedColor);
progressDrawable.setPressedColor(_pressedColor);
progressDrawable.setCheckedColor(_checkedColor);
invalidate();}publicclassTintableRatingBarProgressDrawableextendsDrawable{privatestaticfinalint STAR_COUNT =5;privatestaticfinalint STAR_BRANCHES_COUNT =5;/** Sets the max level value: if the level is at the max, then all stars are selected. */privateint ratingMaxLevelValue =10000;/** Color to be painted for unselected stars */privateint uncheckedColor =Color.GRAY;/** Color to be painted for unselected stars when the ratingbar is pressed */privateint pressedColor =Color.CYAN;/** Color to be painted for selected stars */privateint checkedColor =Color.BLUE;@Overridepublicvoid setAlpha(finalint _i){}@Overridepublicvoid setColorFilter(finalColorFilter _colorFilter){}@Overridepublicboolean isStateful(){returntrue;}@Overridepublicboolean setState(finalint[] stateSet){finalboolean res =super.setState(stateSet);
invalidateSelf();return res;}@Overridepublicint getOpacity(){return255;}publicvoid setRatingMaxLevelValue(finalint _ratingMaxLevelValue){
ratingMaxLevelValue = _ratingMaxLevelValue;}publicvoid setUnCheckedColor(finalint _uncheckedColor){
uncheckedColor = _uncheckedColor;}publicvoid setPressedColor(finalint _pressedColor){
pressedColor = _pressedColor;}publicvoid setCheckedColor(finalint _checkedColor){
checkedColor = _checkedColor;}@Overridepublicvoid draw(finalCanvas _canvas){boolean pressed =false;for(int i : getState()){if(i == android.R.attr.state_pressed){
pressed =true;}}finalint level =(int)Math.ceil(getLevel()/(double) ratingMaxLevelValue * STAR_COUNT);finalint starRadius =Math.min(getBounds().bottom /2, getBounds().right / STAR_COUNT /2);for(int i =0; i < STAR_COUNT; i++){finalint usedColor;if(level >= i +1){
usedColor = checkedColor;}elseif(pressed){
usedColor = pressedColor;}else{
usedColor = uncheckedColor;}
drawStar(_canvas, usedColor,(i *2+1)* starRadius, getBounds().bottom /2, starRadius,
STAR_BRANCHES_COUNT);}}privatevoid drawStar(finalCanvas _canvas,finalint _color,finalfloat _centerX,finalfloat _centerY,finalfloat _radius,finalint _branchesCount){finaldouble rotationAngle =Math.PI *2/ _branchesCount;finaldouble rotationAngleComplement =Math.PI /2- rotationAngle;//Calculating how much space is left between the bottom of the star and the bottom of the circle//In order to be able to center the star visually relatively to the square when drawnfinalfloat bottomOffset =(float)(_radius - _radius *Math.sin(rotationAngle /2)/Math.tan(
rotationAngle /2));finalfloat actualCenterY = _centerY +(bottomOffset /2);finalPaint paint =newPaint();
paint.setColor(_color);
paint.setStyle(Style.FILL);finalPath path =newPath();finalfloat relativeY =(float)(_radius - _radius *(1-Math.sin(rotationAngleComplement)));finalfloat relativeX =(float)(Math.tan(rotationAngle /2)* relativeY);finalPointF a =newPointF(-relativeX,-relativeY);finalPointF b =newPointF(0,-_radius);finalPointF c =newPointF(relativeX,-relativeY);
path.moveTo(_centerX + a.x, actualCenterY + a.y);
_canvas.save();for(int i =0; i < _branchesCount; i++){
path.lineTo(_centerX + b.x, actualCenterY + b.y);
path.lineTo(_centerX + c.x, actualCenterY + c.y);
rotationToCenter(b, rotationAngle);
rotationToCenter(c, rotationAngle);}
_canvas.drawPath(path, paint);
_canvas.restore();}privatevoid rotationToCenter(finalPointF _point,finaldouble _angleRadian){finalfloat x =(float)(_point.x *Math.cos(_angleRadian)- _point.y *Math.sin(_angleRadian));finalfloat y =(float)(_point.x *Math.sin(_angleRadian)+ _point.y *Math.cos(_angleRadian));
_point.x = x;
_point.y = y;}}}
Como a resposta anterior indica, não é fácil alterar a cor da barra de classificação. As estrelas não são desenhadas programaticamente, são imagens com tamanho fixo e gradientes de cores específicos. Para alterar a cor, você deve criar suas próprias imagens de estrela com cores diferentes e, em seguida, criar seu próprio recurso XML desenhável e passá-lo para a classe ratingsBar usando o atributo setProgressDrawable (Drawable d) ou XML android: progressDrawable.
Respostas:
Etapa 1: Crie seu próprio estilo, clonando um dos estilos existentes (de
$ANDROID_HOME/platforms/$SDK/data/res/values/styles.xml
), colocando-o no seu próprio projetostyles.xml
e fazendo referência a ele quando você adiciona o widget a um layout.Etapa 2: crie seus próprios
LayerDrawable
recursos XML para oRatingBar
, apontando para as imagens apropriadas a serem usadas na barra. Os estilos originais apontarão para os recursos existentes com os quais você pode comparar. Em seguida, ajuste seu estilo para usar seus própriosLayerDrawable
recursos, em vez dos recursos internos.fonte
É um pouco complicado no blog mencionado, usei uma maneira semelhante, mas mais simples. Você precisa de imagens de 3 estrelas (red_star_full.png, red_star_half.png e red_star_empty.png) e um xml, só isso.
Coloque essas 3 imagens em res / drawable.
Coloque aqui a seguinte ratingbar_red.xml:
e, finalmente, diga à sua definição da barra de classificação para usar isso, ou seja,
É isso aí.
fonte
Tente isso, se você quiser apenas mudar de cor:
fonte
PorterDuff.Mode.SRC_ATOP
significa ou faz?Drawable stars = rb.getProgressDrawable(); stars.setTint( Color.YELLOW );
A maneira mais fácil que funcionou para mim ... se você estiver estendendo a Atividade AppCompat
Em seu build.gradle, adicione a biblioteca appcompat mais recente.
Faça sua atividade estender android.support.v7.app.AppCompatActivity
Declare o estilo customizado em seu arquivo styles.xml.
Aplique esse estilo à sua RatingBar via atributo android: theme.
fonte
style="?android:ratingBarStyleSmall"
juntos.<style name="RatingBarSmallTheme" parent="Theme.AppCompat"> <item name="colorControlNormal">@color/colorOrangeNormal</item> <item name="colorControlActivated">@color/colorOrangeActivated</item> <item name="ratingBarStyle">@style/Widget.AppCompat.RatingBar.Small</item> </style>
e sua classificaçãoBarandroid:theme="@style/RatingBarSmallTheme"
Atualização de 2015
Agora você pode usar DrawableCompat para colorir todos os tipos de drawables. Por exemplo:
Isso é compatível com versões anteriores até API 4
fonte
if(Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP_MR1) {}
uma vez que está trabalhando por padrão de API 22.A partir da API 21 , é muito fácil alterar a cor das estrelas com estas três linhas de código:
Fazendo assim, você mudará:
fonte
Se você deseja alterar a cor de todas as estrelas, declarei o meu uso:
fonte
As soluções que Alex e CommonsWares publicaram estão corretas. Uma coisa sobre a qual o Android nunca fala é sobre tamanhos de pixels adequados para diferentes densidades. Aqui estão as dimensões necessárias para cada densidade com base na luz halo.
Estrela pequena
Estrela Média
Estrela grande
fonte
Então, eu estou lutando com esse problema há duas horas e criei uma solução funcional para todas as versões da API, onde também são mostradas classificações de meia estrela.
Você chama o método com esta ordem de drawables:
NOTA: Você também deve especificar os atributos "max" e "numStars" em XML, caso contrário, meias estrelas não serão exibidas.
fonte
Mode.SRC_IN
ouMode.MULTIPLY
?Agora você pode usar o DrawableCompat a partir do AppCompat v22.1.0 para colorir dinamicamente todos os tipos de drawables, úteis quando você oferece suporte a vários temas com um único conjunto de drawables. Por exemplo:
Isso é compatível com a API 4. Consulte também a publicação no blog de Chris Banes em Support Libraries v22.1.0
Para o tamanho e a forma reais, você precisará definir um novo estilo e drawables de lista de camadas para o tamanho apropriado, como outros já responderam acima.
fonte
Usar
android:theme
atributo:styles.xml
layout.xml
fonte
Por apenas alterar a cor da barra de classificação de xml: -
fonte
Para mudar a cor basta colocar o parâmetro android: progressTint
Para o tamanho da propriedade style.
fonte
A maneira mais simples:
fonte
Construindo a resposta da @ lgvalle.
Isso manterá as cores das etapas da fração.
fonte
use sua própria cor
fonte
Sem adicionar um novo estilo, você pode usar a cor da tonalidade dentro do
RatingBar
fonte
Funciona para Android abaixo e acima da versão 21
Depois de algumas pesquisas, desenvolvi esse método para definir a tonalidade de fundo, a diferença de espaço (ex: meia estrela) e a cor da tonalidade da estrela.
fonte
Solução simples, use AppCompatRatingBar e seu método setProgressTintList para conseguir isso; consulte esta resposta para referência.
fonte
Eu resolvo esse problema da seguinte maneira:
fonte
para mim está funcionando ....
fonte
Encontrei uma solução simples para mudar a cor da estrela de acordo com o seu tema.
Ir para este site: http://android-holo-colors.com/
Escolha a cor do seu tema e crie suas imagens de estrelas.
fonte
Usando as respostas acima, criei um método estático rápido que pode ser facilmente reutilizado. Ele visa apenas colorir a cor do progresso das estrelas ativadas. As estrelas que não são ativadas permanecem cinza.
Basta passar sua barra de classificação e uma cor usando
getResources().getColor(R.color.my_rating_color)
Como você pode ver, eu uso o DrawableCompat, por isso é compatível com versões anteriores.
EDIT: Este método não funciona na API21 (veja o porquê). Você acaba com um NullPointerException ao chamar setProgressBar. Acabei desativando todo o método na API> = 21.
Para API> = 21, eu uso a solução SupperPuccio.
fonte
A barra de classificação é usada automaticamente no tempo de execução para alterar a cor na estrela de toque.
Primeiro adicione estilo no arquivo app \ src \ main \ res \ values \ styles.xml:
Em seguida, sua barra de classificação adiciona um tema como este:
fonte
1) declarar este xml
2) em style.xml
3)
6) classificação ativa --- tire qualquer imagem com cor escura, pois ela será usada como transparência de cores para classificações diferentes
rating_inactive - tira qualquer imagem do mesmo tamanho da imagem acima com fundo claro ... será usada quando nenhuma classificação for selecionada
fonte
Uma maneira muito fácil de alterar a cor da borda das estrelas é usar o parâmetro xml:
na visualização ratingBar. O valor deve ser um código hexadecimal para uma cor.
fonte
Eu estava procurando por um método confiável para fazer isso até a API 9, pelo menos. A solução "transmitir para LayerDrawble" parecia uma solução arriscada para mim e, quando o testei em um telefone Android no 2.3, foi transmitida com sucesso, mas a chamada para DrawableCompat.setTint (...) não teve nenhum efeito.
A necessidade de carregar recursos extraíveis também não me pareceu uma boa solução.
Decidi codificar minha própria solução, que é uma classe que estende AppCompatRatingBar, usando um Drawable personalizado, cuidando de desenhar as estrelas programaticamente. Funciona perfeitamente para as minhas necessidades, postarei caso ajude alguém:
https://gist.github.com/androidseb/2b8044c90a07c7a52b4bbff3453c8460
O link é mais fácil porque você pode obter o arquivo completo diretamente, mas aqui está o código completo, apenas no caso de:
fonte
Resposta um pouco tarde, mas espero que ajude algumas pessoas.
E aqui está a aparência do WhiteRatingStar
Com isso, as estrelas serão coloridas em branco, por exemplo.
fonte
Use este link
Classificação do Android
defina seu estilo dentro de valor / estilo (v-21);
fonte
Como a resposta anterior indica, não é fácil alterar a cor da barra de classificação. As estrelas não são desenhadas programaticamente, são imagens com tamanho fixo e gradientes de cores específicos. Para alterar a cor, você deve criar suas próprias imagens de estrela com cores diferentes e, em seguida, criar seu próprio recurso XML desenhável e passá-lo para a classe ratingsBar usando o atributo setProgressDrawable (Drawable d) ou XML android: progressDrawable.
fonte