Ответ 1
Вы можете легко изменить оттенок, используя код:
ImageButton button = (ImageButton) this.findViewById(R.id.button_i_want_to_modify);
button.setColorFilter(Color.argb(255, 255, 255, 255)); // White Tint
Надеюсь, что это поможет.
JS
У меня есть ImageButton
в моем приложении, и мне нужно изменить оттенок изображения, когда кнопка pressed/focused
. У меня есть параметр ImageButton
, чтобы получить его src
из XML файла, который выглядит следующим образом:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<!-- pressed -->
<item
android:state_pressed="true"
android:tint="@color/black"
android:drawable="@drawable/search"
/>
<!-- focused -->
<item
android:state_focused="true"
android:tint="@color/black"
android:drawable="@drawable/search"
/>
<!-- default -->
<item
android:tint="@null"
android:drawable="@drawable/search"
/>
</selector>
Однако оттенок не применяется, когда нажата или сфокусирована кнопка ImageButton
- изображение отображается как обычно. Цвет черный определяется как #000000
, как всегда. Любые идеи?
Вы можете легко изменить оттенок, используя код:
ImageButton button = (ImageButton) this.findViewById(R.id.button_i_want_to_modify);
button.setColorFilter(Color.argb(255, 255, 255, 255)); // White Tint
Надеюсь, что это поможет.
JS
Вот как это сделать, используя только XML. В вашей папке drawable создайте селектор. Например: touch_selector.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<!-- State when a row is being pressed, but hasn't yet been activated (finger down) -->
<item android:state_pressed="true" android:color="@color/semi_slate" />
<!-- When the view is "activated". In SINGLE_CHOICE_MODE, it flags the active row
of a ListView -->
<item android:state_activated="true" android:color="@color/semi_slate" />
<!-- Default, "just hangin' out" state. -->
<item android:color="@android:color/transparent" />
</selector>
В моем представлении изображения в xml я установил атрибут android: tint для рисования, созданного выше.
android:tint = "@drawable/touch_selector"
Весь код выглядел так:
<?xml version="1.0" encoding="utf-8"?>
<ImageView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/poster"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:adjustViewBounds="true"
android:scaleType="centerCrop"
android:tint="@drawable/touch_selector" />
Это полностью XML-решение для нанесения оттенка на ImageView при печати или при активном. Подобное можно сделать для ImageButton
Обратите внимание, что это работает только для уровня API> = 21.
Я нашел способ сделать это в xml (в api 21 и по крайней мере).
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true" >
<bitmap
android:src="@drawable/search"
android:tint="@color/black"
/>
</item>
<item android:drawable="@drawable/search"/>
</selector>
Установив оттенок на растровое изображение, можно повторно использовать один и тот же drawable в xml без необходимости перехватывать штрихи или подкласс ImageView или ImageButton.
Как только селектор был создан, просто примените его как src ImageView или ImageButton.
Наконец, я нашел решение для API <21:
Button more = (Button) findViewById(R.id.more);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
more.getBackground().setColorFilter(color, PorterDuff.Mode.SRC_IN);
} else {
Drawable wrapDrawable = DrawableCompat.wrap(more.getBackground());
DrawableCompat.setTint(wrapDrawable, color));
more.setBackgroundDrawable(DrawableCompat.unwrap(wrapDrawable));
}
Пусть это поможет кому-то не потерять 2 часа!
bt.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
bt.setColorFilter(Color.argb(255, 255, 255, 255)); // White Tint
return true; // if you want to handle the touch event
case MotionEvent.ACTION_UP:
bt.clearColorFilter(); // White Tint
return true; // if you want to handle the touch event
}
return false;
}
});
Что я делаю, так это добавить пользовательскую кнопку с функцией setColorFilter.
Подобным образом я могу использовать новую кнопку в xml.
public class CustomButton extends Button {
public CustomButton(Context context) {
super(context);
}
public CustomButton(Context context, AttributeSet attributes) {
super(context, attributes);
};
@Override
public boolean onTouchEvent(MotionEvent event) {
int maskedAction = event.getActionMasked();
if (maskedAction == MotionEvent.ACTION_DOWN)
getBackground().setColorFilter(Color.argb(150, 155, 155, 155), PorterDuff.Mode.DST_IN);
else if (maskedAction == MotionEvent.ACTION_UP)
getBackground().setColorFilter(null);
return super.onTouchEvent(event);
}}
и для ImageButton
public class CustomImageButton extends ImageButton {
public CustomImageButton(Context context) {
super(context);
}
public CustomImageButton(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
int maskedAction = event.getActionMasked();
if (maskedAction == MotionEvent.ACTION_DOWN)
setColorFilter(Color.argb(150, 155, 155, 155), PorterDuff.Mode.DST_IN);
else if (maskedAction == MotionEvent.ACTION_UP)
setColorFilter(null);
return super.onTouchEvent(event);
}}
Я заметил, что здесь есть несколько запросов для людей, желающих узнать, как это сделать в XML. На самом деле это довольно просто. Это может быть выполнено с помощью layer-list
Ваша кнопка доступна (drawable/some_button.xml):
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true" android:drawable="@drawable/some_button_highlighted" />
<item android:drawable="@drawable/some_button_image" />
</selector>
И это выделенное drawable (drawable/some_button_highlighted.xml)
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/some_button_image"/>
<item>
<shape>
<solid android:color="@color/highlighted_button_color" />
</shape>
</item>
</layer-list>
Теперь вы можете использовать это в любом другом xml:
...
android:drawable="@drawable/some_button"
...
Я надеюсь, что это поможет кому-то в будущем.
Вы можете установить цвет (оттенок) из xml.
Установите transparent
(android:background="@null"
) для background
, затем используйте tint
:
<ImageButton
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:tint="@color/Amber_200"
android:background="@null"
android:src="@drawable/back_selector" />
Как вы определили селектор как src в ImageButton Android, AFAIK просто возьмет выделение, потому что это соответствует типу src. Таким образом, оттенок не будет использоваться.
Тем не менее, у меня была аналогичная проблема: я также попытался использовать селектор, как ваш, но для android: значение оттенка ImageButton вместо android: src. Конечно, я опустил значения оттенков, которые у вас есть в вашем селекторе. Это также решит вашу проблему, потому что вы хотите использовать один и тот же шаблон для всех состояний. Любопытно, что я получаю NumberFormatException каждый раз, заявляя, что системе не удалось разобрать "res/color/tint_selector.xml" (который действительно мой селектор) как целое. Чтобы быть конкретным, мой код выглядит следующим образом:
Это мой селектор, сохраненный в /res/color/tint _selector.xml:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true"
android:color="#D3D3D3"/> <!-- pressed -->
<item android:color="#ff000000"/> <!-- default -->
</selector>
И это соответствующий ImageButton:
<ImageButton android:id="@+id/program_help"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:src="@drawable/symbol"
android:tint="@color/tint_selector">
</ImageButton>
Возможно, это немного помогает, хотя в настоящее время оно не работает.