2010-11-09 4 views
16

Я установил изображение в качестве кнопки backgroud, но кнопка не имеет подсветки при нажатии на нее. Есть ли способ решить эту проблему.Как сделать кнопку подсветкой?

+1

см это [ссылка] (http://stackoverflow.com/questions/4125774/android-button-set-onclick-background-image-change-with-xml/4125877#4125877) – David

ответ

10

Чтобы получить доступ к правильному ресурсу, приведена документация StateList Drawable. Вы просто создаете и определяете его в своем подкаталоге res/drawable и устанавливаете его в качестве фона кнопок.

+0

Отличный ответ! Что ты здесь делаешь в прошлом? ;-) –

13

См here

А также here для ответа Ромена Гай:

В Рез/рисуемых, создайте файл с именем, например, mybutton_background.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="false" 
     android:drawable="@drawable/button_background_focus" /> 

    <item android:state_focused="true" android:state_pressed="true" 
     android:drawable="@drawable/button_background_pressed" /> 

    <item android:state_focused="false" android:state_pressed="true" 
     android:drawable="@drawable/button_background_pressed" /> 

    <item android:drawable="@drawable/button_background_normal" /> 

</selector> 

Затем установите это значение как t он на фоне вашей кнопки с android:background="@drawable/mybutton_background"

+0

я могу» я добираюсь до этого веб-сайта, потому что я в Китае .... спасибо. – Nick

+0

Вы можете использовать прокси-сервер, чтобы туда добраться. Во всяком случае, обновил свой ответ с помощью решения (написанного Роменом Гаем) –

4

если вы используете

<Button 
    ------------------ 
android:background="@drawable/youimage" 
> 

Тогда как лучше объявить новый новый XML. с изображением вы можете указать изображение для каждого event state. а Октавиан говорит
, и вы можете вы можете установить этот XML, как вы фон

если ваш XML является «Рез/рисуем/abc.xml» затем установить фон, как

android:background="@drawable/abc" 

Вы также можете использовать ImageButton

<ImageButton 
---------------------- 
android:src="@drawable/youimage" 
/> 

Пособие для ImageButton заключается в том, что нет необходимости в другом изображении для подсветки.

0

Использование View.setFocusableInTouchMode или андроид: focusableInTouchMode. В этом случае используйте эту часть для своей кнопки, либо в формате XML, либо в самом коде. Для получения дополнительной информации см : HTTP: //developer.android.com/reference/android/view/View.html

+0

Я - Китай, здесь есть GFW, поэтому я не могу получить http://developer.android.com/ спасибо в любом случае – Nick

2

Я сделал это путем переназначения кнопок класса

public class MButton extends Button { 
public MButton(Context context, AttributeSet attrs, int defStyle) { 
    super(context, attrs, defStyle); 
    // TODO Auto-generated constructor stub 
} 

public MButton(Context context, AttributeSet attrs) { 
    super(context, attrs); 
    // TODO Auto-generated constructor stub 

} 

public MButton(Context context) { 
    super(context); 
    // TODO Auto-generated constructor stub 
} 

//define style 
public void setPressedBg(Integer[] mImageIds) { 
    StateListDrawable bg = new StateListDrawable(); 
    Drawable normal = this.getResources().getDrawable(mImageIds[0]); 
    Drawable selected = this.getResources().getDrawable(mImageIds[1]); 
    Drawable pressed = this.getResources().getDrawable(mImageIds[2]); 

    bg.addState(View.PRESSED_ENABLED_STATE_SET, pressed); 
    bg.addState(View.ENABLED_FOCUSED_STATE_SET, selected); 
    bg.addState(View.ENABLED_STATE_SET, normal); 
    bg.addState(View.FOCUSED_STATE_SET, selected); 
    bg.addState(View.EMPTY_STATE_SET, normal); 
    this.setBackgroundDrawable(bg); 
} 

//define style 
public void setPressedBg(Integer p1,Integer p2,Integer p3) { 
    StateListDrawable bg = new StateListDrawable(); 
    Drawable normal = this.getResources().getDrawable(p1); 
    Drawable selected = this.getResources().getDrawable(p2); 
    Drawable pressed = this.getResources().getDrawable(p3); 

    bg.addState(View.PRESSED_ENABLED_STATE_SET, pressed); 
    bg.addState(View.ENABLED_FOCUSED_STATE_SET, selected); 
    bg.addState(View.ENABLED_STATE_SET, normal); 
    bg.addState(View.FOCUSED_STATE_SET, selected); 
    bg.addState(View.EMPTY_STATE_SET, normal); 
    this.setBackgroundDrawable(bg); 
} 

}

в моем main()

toneButton.setPressedBg(R.drawable.button_tone_protrait_pipa, 
      R.drawable.button_tone_protrait_pipa1, 
      R.drawable.button_tone_protrait_pipa1); 
3

Попробуйте сделать это, чтобы получить изящный эффект бедного человека без необходимости создания нескольких копий ваших изображений. Установите значение альфа 0,8 до требуемого значения:

import android.content.Context; 
import android.util.AttributeSet; 
import android.view.MotionEvent; 
import android.widget.ImageButton; 

public class EAImageButton extends ImageButton { 

    public EAImageButton(Context context) { 
     super(context); 
     // TODO Auto-generated constructor stub 

    } 
    public EAImageButton(Context context, AttributeSet attrs){ 
     super(context,attrs); 
    } 
    public EAImageButton(Context context, AttributeSet attrs, int defStyle){ 
     super(context,attrs,defStyle); 
    } 
    public void setImageResource (int resId){ 
     super.setImageResource(resId); 
    } 
    @Override 
    public boolean onTouchEvent(MotionEvent e){ 
     if(e.getAction() == MotionEvent.ACTION_DOWN){ 
      this.setAlpha((int)(0.8 * 255)); 
     }else if(e.getAction() == MotionEvent.ACTION_UP){ 
      this.setAlpha((int)(1.0 * 255)); 
     } 

     return super.onTouchEvent(e); 

    } 

} 
+0

+100 Чистый и умный. –

20

Если это ImageButton и вы не хотите использовать несколько вытяжки для каждого нажатия/непрессованного состояния можно использовать цветной фильтр изображений атрибута объявления. Это решение аналогично тому, которое используется Омаром.

Создайте OnTouchListener, изменив цветной фильтр при касании.

public class ButtonHighlighterOnTouchListener implements OnTouchListener { 

    final ImageButton imageButton; 

    public ButtonHighlighterOnTouchListener(final ImageButton imageButton) { 
    super(); 
    this.imageButton = imageButton; 
    } 

    public boolean onTouch(final View view, final MotionEvent motionEvent) { 
    if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) { 
     //grey color filter, you can change the color as you like 
     imageButton.setColorFilter(Color.argb(155, 185, 185, 185)); 
    } else if (motionEvent.getAction() == MotionEvent.ACTION_UP) { 
     imageButton.setColorFilter(Color.argb(0, 185, 185, 185)); 
    } 
    return false; 
    } 

} 

Назначьте этот слушателю кнопке:

myButton = (ImageButton) findViewById(R.id.myButton); 
    myButton.setOnTouchListener(new ButtonHighlighterOnTouchListener(myButton)); 

Update

улучшенный класс применять фломастер для ImageView, ImageButton или TextView через его соединение Drawable.

public class ButtonHighlighterOnTouchListener implements OnTouchListener { 

    private static final int TRANSPARENT_GREY = Color.argb(0, 185, 185, 185); 
    private static final int FILTERED_GREY = Color.argb(155, 185, 185, 185); 

    ImageView imageView; 
    TextView textView; 

    public ButtonHighlighterOnTouchListener(final ImageView imageView) { 
    super(); 
    this.imageView = imageView; 
    } 

    public ButtonHighlighterOnTouchListener(final TextView textView) { 
    super(); 
    this.textView = textView; 
    } 

    public boolean onTouch(final View view, final MotionEvent motionEvent) { 
    if (imageView != null) { 
     if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) { 
     imageView.setColorFilter(FILTERED_GREY); 
     } else if (motionEvent.getAction() == MotionEvent.ACTION_UP) { 
     imageView.setColorFilter(TRANSPARENT_GREY); // or null 
     } 
    } else { 
     for (final Drawable compoundDrawable : textView.getCompoundDrawables()) { 
     if (compoundDrawable != null) { 
      if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) { 
      // we use PorterDuff.Mode. SRC_ATOP as our filter color is already transparent 
      // we should have use PorterDuff.Mode.LIGHTEN with a non transparent color 
      compoundDrawable.setColorFilter(FILTERED_GREY, PorterDuff.Mode.SRC_ATOP); 
      } else if (motionEvent.getAction() == MotionEvent.ACTION_UP) { 
      compoundDrawable.setColorFilter(TRANSPARENT_GREY, PorterDuff.Mode.SRC_ATOP); // or null 
      } 
     } 
     } 
    } 
    return false; 
    } 

} 
+0

Только одна коррекция: вам нужно возвратить true в onTouch(), чтобы сказать, что вы сделали какое-то действие в касательном действии. –

+0

это то, что я искал .. imageView.setColorFilter() отлично работает –

Смежные вопросы