Как разработать коробку, такую ​​​​как панель рейтинга, как приложение zomato для Android?

Я хочу разработать панель рейтинга, такую ​​​​как приложение для Android zomato. В котором поле рейтинга меняет свой цвет в зависимости от выбора. если выбрано только одно поле, то его цвет будет читаться, и постепенно мы выбираем больше полей, оно становится зеленым.

Здесь я прикрепил снимок части экрана приложения zomato для Android, который точно показывает рейтинг. Я хотел бы разработать этот тип системы рейтинга и обзора.

введите здесь описание изображения


person Bhavikkumar    schedule 17.10.2017    source источник
comment
что вы пробовали до сих пор? показать нам некоторые усилия   -  person King of Masses    schedule 17.10.2017
comment
Что вы пробовали, это не должно быть слишком сложно реализовать.   -  person Lakshmikant Deshpande    schedule 17.10.2017
comment
Я должен добиться, чтобы сделать панель звездного рейтинга, используя представление рейтинга   -  person Bhavikkumar    schedule 17.10.2017
comment
@KingofMasses Используя помощь в Интернете, я разрабатываю образец для оценки. Используя стандартную панель рейтинга, я могу заменить звездочку на квадрат, но я не могу понять, как изменить цвет в соответствии с изменением значения рейтинга.   -  person Bhavikkumar    schedule 17.10.2017
comment
Вместо панели рейтинга создайте представления и обработайте их соответственно вашим потребностям.   -  person King of Masses    schedule 17.10.2017


Ответы (2)


Это простой горизонтальный LinearLayout с 9 TextView, каждый из которых имеет серый цвет по умолчанию. Кроме того, вы можете создать массив строк, каждая строка представляет собой цветовой код. Это быстрое и грязное решение.

Нажав на TextView, вы можете узнать его положение в LinearLayout и раскрасить каждое представление перед ним соответствующим цветовым кодом в массиве вместе с выбранным представлением, а остальные останутся серыми.

Однажды у меня была аналогичная проблема с индикатором выполнения, состоящим из 10 разделов, и вместо того, чтобы искать библиотеку, я сделал что-то вроде этого, и это сработало просто отлично.

person radu.bn    schedule 17.10.2017
comment
Я то же самое собираюсь написать! Это может быть любой вид, не только Textview. - person King of Masses; 17.10.2017
comment
Хорошо, но также мне нужно сделать смахивание, как на стандартной панели рейтинга, чтобы в этом случае дать рейтинг, как мы можем достичь. - person Bhavikkumar; 17.10.2017
comment
@bhavikkumar Если вы хотите добавить смахивание, это сложнее, чем это, и вам следует использовать специальный компонент. - person radu.bn; 17.10.2017

Я нашел решение для того, что нам нужно сделать пользовательскую панель рейтинга. Ниже приведен код, показывающий пользовательский класс панели рейтинга. которые полностью заполняют все требования, которые упоминаются в вопросе.

public class MyCustomRatingBar extends android.support.v7.widget.AppCompatRatingBar {

private int[] iconArrayActive =  {
        R.drawable.ic_square_sel_1,
        R.drawable.ic_square_sel_2,
        R.drawable.ic_square_sel_3,
        R.drawable.ic_square_sel_4,
        R.drawable.ic_square_sel_5,
        R.drawable.ic_square_sel_6,
        R.drawable.ic_square_sel_7,
        R.drawable.ic_square_sel_8,
        R.drawable.ic_square_sel_9
};

private int[] iconArrayInactive =  {
        R.drawable.ic_square_unsel,
        R.drawable.ic_square_unsel,
        R.drawable.ic_square_unsel,
        R.drawable.ic_square_unsel,
        R.drawable.ic_square_unsel,
        R.drawable.ic_square_unsel,
        R.drawable.ic_square_unsel,
        R.drawable.ic_square_unsel,
        R.drawable.ic_square_unsel
};

public MyCustomRatingBar (Context context) {
    super(context);
    init();
}

public MyCustomRatingBar (Context context, AttributeSet attrs) {
    super(context, attrs);
    init();
}

public MyCustomRatingBar (Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
    init();
}

private void init() {
    this.setMax(9);
    this.setNumStars(9);
    this.setStepSize(1.0f);
    this.setRating(1.0f);
}

private Bitmap getBitmapFromVectorDrawable(Context context, int drawableId) {
    Drawable drawable = ContextCompat.getDrawable(context, drawableId);
    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
        drawable = (DrawableCompat.wrap(drawable)).mutate();
    }

    Bitmap bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(),
            drawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888);
    Canvas canvas = new Canvas(bitmap);
    drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
    drawable.draw(canvas);

    return bitmap;
}

@Override
protected synchronized void onDraw(Canvas canvas) {

    int stars = getNumStars();
    float rating = getRating();
    float x = 0;

    Bitmap bitmap;
    Paint paint = new Paint();
    int W = getWidth();
    int H = getHeight();
    int icon_size = (W/stars)-0;

    int y_pos = (H/2)-icon_size/2;

    int delta = ((H > W)?(H):(W))/(stars);
    int offset = (W-(icon_size+(stars-1)*delta))/2;

    for(int i = 0; i < stars; i++) {
        if ((int) rating-1 >= i) {
            bitmap = getBitmapFromVectorDrawable(getContext(), iconArrayActive[i]);
        } else {
            bitmap = getBitmapFromVectorDrawable(getContext(), iconArrayInactive[i]);
        }
        x = offset+(i*delta);
        Bitmap scaled = Bitmap.createScaledBitmap(bitmap, icon_size, icon_size, true);
        canvas.drawBitmap(scaled, x, y_pos, paint);
        canvas.save();
    }
}

}

person Bhavikkumar    schedule 17.10.2017
comment
Спасибо, что поделились этим здесь. Наслаждайтесь программированием - person King of Masses; 18.10.2017