Я использую ImageButton
. Но я не получаю выделение при нажатии. Я гуглил, и многие предлагали использовать селектор, где отображается другое изображение. Есть ли способ обойти это. используя только одно изображение и выделяя его или придавая ему эффект свечения. чтобы пользователь знал, что эта кнопка была нажата.
Android выделяет кнопку изображения при нажатии
Ответы (5)
На самом деле это не очень сложно сделать. Вам даже не нужно создавать 2 отдельных файла .png или что-то в этом роде. Например, если вы хотите иметь кнопку с градиентом, а затем изменять его при нажатии кнопки:
Шаг 1: Создайте градиент кнопки по умолчанию (drawable/default_button.xml):
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<corners android:radius="3dp" />
<gradient android:endColor="#8ba0bb" android:startColor="#43708f" android:angle="90" />
<stroke android:width="1dp" android:color="#33364252" />
</shape>
Шаг 2: Создайте градиент нажатия кнопки по умолчанию (drawable/default_button_pressed.xml):
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<corners android:radius="3dp" />
<gradient android:endColor="#43708f" android:startColor="#8ba0bb" android:angle="90" />
<stroke android:width="1dp" android:color="#33364252" />
</shape>
Шаг 3: Создайте селектор (drawable/default_button_selector.xml):
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
<item android:state_pressed="true" android:drawable="@drawable/default_button_pressed" />
<item android:drawable="@drawable/default_button" />
</selector>
Шаг 4 (необязательно). Создайте стиль для кнопки (values/style.xml):
<resources>
<style name="DefaultButton">
<item name="android:layout_width">wrap_content</item>
<item name="android:layout_height">wrap_content</item>
<item name="android:background">@drawable/default_button_selector</item>
</style>
</resources>
Шаг 5: используйте кнопку (layout/main.xml):
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent" android:layout_height="fill_parent">
<button style="@style/DefaultButton" />
</RelativeLayout>
Как видите, сделать это не особо сложно.
As you can see, it's not particularly difficult to do.
- person Will Tate; 16.03.2011
Без необходимости создавать несколько изображений (нажатых, обычных и т. д.) и даже без необходимости создавать селектор. Используйте setOnTouchListener вместо setOnClickListener. Приведенный ниже код даст вам серое наложение на выбранный элемент.
((ImageButton)findViewById(R.id.myImageBtn)).setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN: {
ImageButton view = (ImageButton ) v;
view.getBackground().setColorFilter(0x77000000, PorterDuff.Mode.SRC_ATOP);
v.invalidate();
break;
}
case MotionEvent.ACTION_UP:
// Your action here on button click
case MotionEvent.ACTION_CANCEL: {
ImageButton view = (ImageButton) v;
view.getBackground().clearColorFilter();
view.invalidate();
break;
}
}
return true;
}
});
break;
, поэтому он очистит его :)
- person dragi; 21.02.2017
Чтобы не устанавливать несколько рисунков для каждой кнопки, я установил атрибут цветового фильтра кнопки изображения в прослушивателе касания.
Смотрите код здесь в другом сообщении:
https://stackoverflow.com/a/14278790/891479
Мне удалось это сделать!! Сначала вы объявляете buttonStyle.xml в папке с возможностью рисования.
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:state_focused="true"
android:state_pressed="true"
android:drawable="@drawable/button_pressed" />
<item
android:state_focused="false"
android:state_pressed="true"
android:drawable="@drawable/button_pressed" />
<item android:drawable="@drawable/button_normal" />
</selector>
Затем вы создаете button_pressed.xml в папке с возможностью рисования.
<?xml version="1.0" encoding="UTF-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle" >
<solid android:color="@color/semiTransparentGnfrBlueColor" />
<stroke android:width="10dp" android:color="@android:color/transparent" />
</shape>
После этого вы создаете button_normal.xml в папке drawable.
<?xml version="1.0" encoding="UTF-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:innerRadiusRatio="3"
android:shape="rectangle">
<solid android:color="@color/gnfrBlueColor"/>
<stroke android:width="10dp" android:color="@android:color/transparent" />
</shape>
Вы можете использовать цвета по умолчанию, но если вы хотите сделать это, как я, вам нужно иметь файл с именем colors.xml в папке значений и эти значения внутри:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<item name="gnfrBlueColor" type="color">#2A3748</item>
<item name="semiTransparentGnfrBlueColor" type="color">#602A3748</item>
<integer-array name="androidcolors">
<item>@color/gnfrBlueColor</item>
<item>@color/semiTransparentGnfrBlueColor</item>
</integer-array>
</resources>
Наконец, вы устанавливаете это на свою кнопку или что-то еще:
savedAccountLoginButton.SetBackgroundResource(Resource.Drawable.buttonStyle);
ЗАМЕТЬТЕ, ЧТО я установил обводку с прозрачным цветом, потому что, когда вы устанавливаете backgroundresource, ваша кнопка становится больше, и с этим трюком она остается оригинальной.
Это единственный способ, которым я мог заархивировать это программно.
Если вы хотите сделать это с помощью XML:
<Button
android:text="ENTRAR"
android:layout_width="match_parent"
android:layout_height="60dp"
android:background="@drawable/buttonstyle"
android:textColor="@color/white"
android:textSize="18sp"
android:id="@+id/button1" />
Вы можете просто использовать android:foreground
для своего View
, чтобы добиться кликабельного эффекта:
android:foreground="?android:attr/selectableItemBackground"
Для использования с темной темой добавьте также theme в свой layout
(чтобы сделать кликабельный эффект понятным):
android:theme="@android:style/ThemeOverlay.Material.Dark"