Barra de clasificación personalizada en dispositivos de pan de jengibre
He creado un RatingBar personalizado, que puede tener 5 colores diferentes y tienen barra de rectángulo con puntos debajo de las estrellas. Así es como se ve:
- obtener valor RatingBar mientras se desliza
- Construir una RatingBar utilizando imágenes cargadas desde la web
- ¿Cómo permitir valores completos (enteros) sólo en barras de calificación?
- Problema de tamaño vertical de la barra de clasificación de Android
- Android Nougat (7.0 / API 24) cuenta de clasificación está mal en OnRatingBarChangeListener
Estoy utilizando esta vista en un par de lugares y todo está bien en Android 4.0 o superior. Pero en Gingerbread tengo algunos problemas. Aquí está el código para la clase view:
public class KrinsenRating extends RelativeLayout { private TextView mRanking; private RatingBar mStars; public KrinsenRating(Context context, AttributeSet attrs) { super(context, attrs); LayoutInflater layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); layoutInflater.inflate(R.layout.krinsen_rating, this); loadViews(); } public KrinsenRating(Context context) { super(context); loadViews(); } private void loadViews() { mRanking = (TextView) findViewById(R.id.ranking_bar_position); mStars = (RatingBar) findViewById(R.id.ranking_bar); } public void setRating(long rating){ RatingConverter rc = new RatingConverter(rating); Bitmap bmp_empty = ((BitmapDrawable) getResources().getDrawable(R.drawable.star_empty)).getBitmap(); Bitmap bmp_half = null; Bitmap bmp_full = null; switch (rc.getColor()) { case 1: bmp_half = ((BitmapDrawable) getResources().getDrawable(R.drawable.star_half1)).getBitmap(); bmp_full = ((BitmapDrawable) getResources().getDrawable(R.drawable.star_full1)).getBitmap(); mRanking.setBackgroundColor(getResources().getColor(R.color.ranking1)); break; case 2: bmp_half = ((BitmapDrawable) getResources().getDrawable(R.drawable.star_half2)).getBitmap(); bmp_full = ((BitmapDrawable) getResources().getDrawable(R.drawable.star_full2)).getBitmap(); mRanking.setBackgroundColor(getResources().getColor(R.color.ranking2)); break; case 3: bmp_half = ((BitmapDrawable) getResources().getDrawable(R.drawable.star_half3)).getBitmap(); bmp_full = ((BitmapDrawable) getResources().getDrawable(R.drawable.star_full3)).getBitmap(); mRanking.setBackgroundColor(getResources().getColor(R.color.ranking3)); break; case 4: bmp_half = ((BitmapDrawable) getResources().getDrawable(R.drawable.star_half4)).getBitmap(); bmp_full = ((BitmapDrawable) getResources().getDrawable(R.drawable.star_full4)).getBitmap(); mRanking.setBackgroundColor(getResources().getColor(R.color.ranking4)); break; case 5: bmp_half = ((BitmapDrawable) getResources().getDrawable(R.drawable.star_half5)).getBitmap(); bmp_full = ((BitmapDrawable) getResources().getDrawable(R.drawable.star_full5)).getBitmap(); mRanking.setBackgroundColor(getResources().getColor(R.color.ranking5)); break; } mStars.setProgressDrawable(GUI.buildRatingBarDrawables(new Bitmap[]{bmp_empty, bmp_half, bmp_full})); mStars.setRating(rc.getRealRating()); mRanking.setText(rating + ""); } }
Esta línea es confusa: mStars.setProgressDrawable(GUI.buildRatingBarDrawables(new Bitmap[]{bmp_empty, bmp_half, bmp_full}));
Pero tuve que tener esto, debido al problema en la prestación de estrellas después de la llamada setProgressDrawable()
(sólo se muestra una estrella estirada). Aquí está el método buildRatingBarDrawables
:
public static Drawable buildRatingBarDrawables(Bitmap[] images) { final int[] requiredIds = { android.R.id.background, android.R.id.secondaryProgress, android.R.id.progress }; final float[] roundedCorners = new float[] { 5, 5, 5, 5, 5, 5, 5, 5 }; Drawable[] pieces = new Drawable[3]; for (int i = 0; i < 3; i++) { ShapeDrawable sd = new ShapeDrawable(new RoundRectShape( roundedCorners, null, null)); BitmapShader bitmapShader = new BitmapShader(images[i], Shader.TileMode.REPEAT, Shader.TileMode.CLAMP); sd.getPaint().setShader(bitmapShader); ClipDrawable cd = new ClipDrawable(sd, Gravity.LEFT, ClipDrawable.HORIZONTAL); if (i == 0) { pieces[i] = sd; } else { pieces[i] = cd; } } LayerDrawable ld = new LayerDrawable(pieces); for (int i = 0; i < 3; i++) { ld.setId(i, requiredIds[i]); } return ld; }
Por lo tanto, todo está bien en Android ICS y más reciente, pero en Gingerbread tengo algunas situaciones extrañas. Primero de todo a veces en pan de jengibre todo está bien. Pero a menudo es que no hay estrellas en absoluto. Barra de rectángulo con puntos es siempre la derecha, pero las estrellas a veces desaparece. Aquí es por ejemplo la pantalla de ListView
que utilizan la barra de la calificación en cada fila única:
Como se puede ver, a veces está bien, a veces no: / Tengo esta barra de calificación en mi navegación slidingMenu y hay estrellas se muestran cuando me deslice lentamente, pero después de la diapositiva es más (cuando onOpened debe ser llamada) las estrellas son sólo desaparecer.
¿Tienes algún pensamiento que me haga más feliz con eso?
He añadido el archivo xml para el diseño de calificación:
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/avatar_layout" android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="center" > <RatingBar android:id="@+id/ranking_bar" android:layout_width="wrap_content" android:layout_height="30dp" android:layout_centerHorizontal="true" android:clickable="false" android:focusable="false" android:isIndicator="true" android:numStars="3" android:progressDrawable="@drawable/krinsen_rating" android:stepSize="0.1" /> <TextView android:id="@+id/ranking_bar_position" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@id/ranking_bar" android:layout_centerHorizontal="true" android:contentDescription="@string/register_avatar" android:paddingBottom="2dp" android:paddingLeft="8dp" android:paddingRight="8dp" android:paddingTop="2dp" android:textColor="@android:color/white" android:textSize="14sp" android:textStyle="bold" /> </RelativeLayout>
- ¿Cómo dar el espaciamiento entre la barra de clasificación de estrellas Android?
- Android RatingBar icono vector no se muestra
- Ocultar sombra de la barra de calificación
- RatingBar se está semi-transparente
- ¿Cómo cambiar las imágenes en estrella de la RatingBar?
- Clasificación de estrellas de Android cómo ajustar a ancho
- ¿Cómo puedo configurar el color estrella de la barra de calificación?
- RatingBar - Alternar o deshacer
Sería un enfoque más fácil para definir sus calificaciones de calificación en una lista de capas dibujable y luego asignar a su clase RatingBar. Funciona para mí en android pan de jengibre y antes.
<?xml version="1.0" encoding="utf-8"?> <layer-list xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@+android:id/background" android:drawable="@drawable/star_empty" /> <item android:id="@+android:id/secondaryProgress" android:drawable="@drawable/star_empty" /> <item android:id="@+android:id/progress" android:drawable="@drawable/star_full" /> </layer-list>
Guarde que en y archivo xml en la carpeta drawables, por ejemplo, myCustomRatingBarDrawable.xml
Luego en cualquier vista RatingBar:
<RatingBar android:id="@+id/ratingbar" android:progressDrawable="@drawable/myCustomRatingBarDrawable" android:isIndicator="true" android:max="5" android:numStars="5" ... />
- ¿Estableciendo el subíndice y el superíndice para el carácter específico en el TextView?
- Pushes no recibidos después de que la aplicación esté cerrada