Android подчертава бутон за изображение при щракване

Използвам ImageButton. Но не получавам акцента, когато щракна. Търсих в Google и много предложиха да се използва селектор, където се показва друго изображение. Има ли някакъв начин да се заобиколи това. като използвате само едно изображение и го подчертаете или му придадете ефект на блясък. така че потребителят да знае, че този бутон е щракнат.


person Droidme    schedule 16.03.2011    source източник
comment
Можете ли да покажете кода, който използвате, за да създадете бутона за изображение?   -  person Cristian    schedule 16.03.2011


Отговори (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>

Както можете да видите, не е особено трудно да се направи.

person Zack Marrapese    schedule 16.03.2011
comment
хаха @Zack As you can see, it's not particularly difficult to do. - person Will Tate; 16.03.2011
comment
Това е хубаво, тъй като можете лесно да добавите редица бутони, използвайки същия стил. - person Matthew Willis; 16.03.2011
comment
какво ще стане, ако имаме нужда от бутони с различни фонови изображения? - person Kishore; 21.08.2012

Без да се налага да създавате множество изображения (натиснати, нормални и т.н.) и дори не трябва да създавате селектор. Използвайте 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;
        }
    });
person Vinayak Bevinakatti    schedule 13.05.2014
comment
Това проработи при мен. Уверете се, че сте изчистили и цветния филтър на ACTION_UP. - person Adam Johns; 06.06.2014
comment
Моят ADT не знаеше какво е „PorterDuff“, така че добавете суфикс с „android.graphics“ (android.graphics.PorterDuff.Mode.SRC_ATOP) за подсказано завършване на кода - person 1owk3y; 02.12.2014
comment
Много ми помогна, Благодаря! - person Idan Magled; 12.06.2015
comment
@AdamJohns, в случая с ACTION_UP няма break;, така че ще го изчисти :) - person dragi; 21.02.2017
comment
Това генерира a11y предупреждение - person Leonardo Rick; 08.05.2021

За да не се налага да задавам няколко чертаеми за всеки бутон, задавам атрибута на цветния филтър на бутона за изображение в слушател при докосване.

Вижте кода тук в друга публикация:

https://stackoverflow.com/a/14278790/891479

person L. G.    schedule 11.01.2013

Успях да направя това!! Първо декларирате 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 в папка с възможност за рисуване.

<?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 в папката values ​​и тези стойности вътре:

<?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);

ЗАБЕЛЕЖЕТЕ, ЧЕ зададох щрих с прозрачен цвят, защото когато зададете фонов ресурс, бутонът ви става по-голям и с този трик остава оригинален.

Това е единственият начин, по който мога да архивирам това програмно.

Ако искате да направите това чрез 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" />
person Dayo    schedule 25.10.2017

Можете просто да използвате android:foreground за вашия View, за да постигнете ефект на кликване:

android:foreground="?android:attr/selectableItemBackground"


За използване с тъмна тема добавете също тема към вашия layout (за да направите ясно ефекта върху кликването):

android:theme="@android:style/ThemeOverlay.Material.Dark"
person Francis    schedule 20.02.2020