Страницы

Поиск по вопросам

четверг, 1 ноября 2018 г.

Как залить фон button частично?

Привет! Нужно вводить число от 0 до 1 в edittext, а после заливать цветом часть фона button в соответствии с введенным числом( т.е. ввели 0.25 - заливаем четверть кнопки)
В списке аттрибутов ничего подобного, к сожалению, нет


Ответ

Предлагаю свой вариант решения вопроса - создание кастомной кнопки с необходимой функцией. Сразу ссылка GitHub на небольшой сэмпл, как это все работает и картинка :

Реализация проста и состоит из менее десятка строчек - подрисовывать на кнопку дополнительный слой с шириной, которую мы можем установить сами:
"Мучить" будем очень модную сейчас material-кнопку (AppCompatButton) из последней support.v7 - 22.1 , но то же самое можно проделать с любым виджетом, это не принципиально. Собственно сам класс кастомной кнопки ProgressButton.java
public class ProgressButton extends AppCompatButton { private float mRatio; private int mColor = Color.GREEN;
public ProgressButton(Context context) { super(context); init(); }
public ProgressButton(Context context, AttributeSet attrs) { super(context, attrs); init(); }
public ProgressButton(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(); }
void init(){
}
public void setRatio (float ratio){ mRatio = ratio; invalidate(); }
public void setColor (int color){ mColor = color; invalidate(); }
@Override protected void onDraw(Canvas canvas) {
Drawable fill = getResources().getDrawable(R.drawable.abc_btn_default_mtrl_shape); fill.setColorFilter( mColor, PorterDuff.Mode.MULTIPLY); fill.setAlpha(128); fill.setBounds(0, 0, (int) (getWidth()*mRatio), getHeight()); fill.draw(canvas); super.onDraw(canvas); } }
в качестве дополнительного слоя мы используем тот же xml (abc_btn_default_mtrl_shape.xml), что используется и для прорисовки бэкграунда самой кнопки, окрашивая его в собственный цвет, но можно использовать и любой собственный вид при необходимости. Прозрачность устанавливается для того, чтобы эффект нажатия был виден по всей кнопке, а не только на не окрашенной части.
кастомная кнопка реализует методы:
setRatio(float ratio) - установить процент заполнения фона кнопки - число от 0 до 1. setColor(Color color) - установить цвет заливки
Теперь, как это все работает. Простой пример заполняет часть кнопки при нажатии на нее:
public class MainActivity extends AppCompatActivity {
ProgressButton button; float ratio;
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); button = (ProgressButton) findViewById(R.id.progress_button);
}
public void onClicked (View view) {
button.setRatio(ratio); ratio = ratio +0.3f; if (ratio >= 1) ratio = 0; } }
activity_main.xml
android:layout_width="match_parent" android:layout_height="match_parent" android:padding="10dp" android:orientation="vertical">

Комментариев нет:

Отправить комментарий