CustomSeekBar с исчезающим альфа-градиентом, черной тонкой рамкой и мозаичным фоном - PullRequest
1 голос
/ 20 марта 2019

Цель

Я пытаюсь повторить этот диалог.

TheDialog

Текущее состояние

Но я только дошел до этой точки (показывая только соответствующую часть):

MyDialog

Чего не хватает

Способ добавления тонкой черной рамки вокруг «области прогресса» моего пользовательского Seekbar и мозаичного фона, ограниченного этой «областью прогресса».

мой код

Как таковой, мой CustomSeekBar (который extends AppCompatSeekBar) отлично работает для установки начального и конечного цвета в коде. Вот функция:

public void setGradientColor(@ColorInt int leftColor, @ColorInt int rightcolor) {
    grad = new GradientDrawable(GradientDrawable.Orientation.LEFT_RIGHT,
            new int[] {leftColor, rightcolor});
    setProgressDrawable(grad);
}

Но попытка установить фоновое изображение в конечном итоге выглядит как моя самая последняя панель поиска на изображении The current state (фон выходит за пределы области прогресса и заполняет всю область просмотра):

    aSeekBar.setBackground(context.getDrawable(R.drawable.checker));
    aSeekBar.setGradientColor(Color.parseColor("#00000000"), Color.parseColor("#FF000000"));

Мой checker.xml файл в res/drawable:

<?xml version="1.0" encoding="utf-8"?>
<bitmap
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:src="@drawable/checkerstile"
    android:tileMode="repeat"
    />

Ответы [ 2 ]

1 голос
/ 21 марта 2019

Я нашел жизнеспособное решение:

    int padding = aSeekBar.getPaddingStart();
    InsetDrawable bgImg = new InsetDrawable(context.getDrawable(R.drawable.checker), padding);
    aSeekBar.setBackground(bgImg);

Объедините это с решением от Оливье для границы, и вы получите такой результат:

phone_demo

1 голос
/ 20 марта 2019

Для части "Граница" вашего вопроса, вам просто нужно добавить обводку в GradientDrawable:

  public void setGradientColor(@ColorInt int leftColor, @ColorInt int rightcolor) {
        grad = new GradientDrawable(GradientDrawable.Orientation.LEFT_RIGHT,
            new int[] {leftColor, rightcolor});
        grad.setStroke(/* stroke width*/, /* int color*/);
        setProgressDrawable(grad);
    }

Для этого, это так просто, извините, я не могу помочь в качестве фона.

...