Кастомный ProgressBar android

161
15 декабря 2017, 03:08

Хочу сделать ProgressBar который состоит из 5-ти звезд. Фон у этих звезд серый и при увеличении прогресса эти звезды должны заполнятся золотым цветом. Пока что у меня получилось просто отрисовать 5 звезд одного цвета.

Сейчас код выглядит так:

public class StartView extends ViewGroup {
    private int progress  = 0;
    private Paint paint = new Paint();
    private Path path = new Path();

    public StartView(Context context) {
        super(context);
        init();
    }
    public StartView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }
    public StartView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }
    public void init() {
        paint.setColor(Color.WHITE);
        paint.setAntiAlias(true);
        paint.setStyle(Paint.Style.STROKE);
    }
    @Override
    protected void onLayout(boolean changed, int l, int t, int r, int b) {
    }
    @Override
    protected void onDraw(Canvas canvas) {
        float mid = getWidth() / 2;
        float min = Math.min(getWidth(), getHeight());
        float fat = min / 17;
        float half = min / 2;
        float margin = half/2;
        mid = mid - half;

        float left = mid  - (half+margin);
        float start = left - (half+margin);
        float right = mid +(half+margin);
        float end = right + (half+margin);

        //mid
        drawStart(canvas,fat,mid,half);
        //to left mid
        drawStart(canvas,fat,left,half);
        drawStart(canvas,fat,start,half);
        //to right mid
        drawStart(canvas,fat,right,half);
        drawStart(canvas,fat,end,half);
        super.onDraw(canvas);
    }
    private void drawStart(Canvas canvas, float fat, float mid , float half){
        paint.setStrokeWidth(fat);
        paint.setStyle(Paint.Style.FILL);
        paint.setColor(ContextCompat.getColor(getContext(),R.color.hintIconColorCommon));
        // top left
        path.moveTo(mid + half * 0.5f, half * 0.84f);
        // top right
        path.lineTo(mid + half * 1.5f, half * 0.84f);
        // bottom left
        path.lineTo(mid + half * 0.68f, half * 1.45f);
        // top tip
        path.lineTo(mid + half * 1.0f, half * 0.5f);
        // bottom right
        path.lineTo(mid + half * 1.32f, half * 1.45f);
        // top left
        path.lineTo(mid + half * 0.5f, half * 0.84f);
        path.close();
        canvas.drawPath(path, paint);
    }
}

и результат вот такой:

Вот пример того что мне нужно получить:

У меня есть предположение что можно просто отрисовать прогресс (золотого цвета) как прямоугольник, а сверху него прозрачные звезды,думаю надо копать куда то в сторону масок, но это не точно.

Вобщем вопрос состоит в том, как можно реализовать нужный мне функционал?

Answer 1

Серый фон, поверх него ProgressBar золотого цвета, поверх него SVG изображение белого цвета с вырезами под звезды. Всё это во FrameLayout(Про него можно почитать тут).

READ ALSO
Подключение в maven сторонней библиотеки

Подключение в maven сторонней библиотеки

Вопрос, хочу добавитьjar библиотеку к maven проекту, чтобы потом jenkins собирался нормально

165
Как проверить, входят ли все элементы одного словаря в другой?

Как проверить, входят ли все элементы одного словаря в другой?

Как можно проверить, содержит ли словарь map1 все пары <Key, Value>, содержащиеся в map2?

137
Почему не инжектится переменная Dagger2

Почему не инжектится переменная Dagger2

Вот сделал имплементацию дагера и вроде как все работет, вот только context переменная не хочет инжектиться

211
Заменить итератор циклом

Заменить итератор циклом

Подскажите пожалуйста, как переписать фрагмент кода, используя вместо итератора цикл:

154