Si j'utilisais un ImageButton avec un sélecteur pour son arrière-plan, y a-t-il un état que je peux changer qui le fera changer d'aspect? À l'heure actuelle, je peux le faire changer d'images lorsque vous appuyez dessus, mais il semble n'y avoir aucun état "surligné", "sélectionné" ou similaire, ce qui me permet de basculer son apparence à volonté.
Voici mon XML; il ne change que l'apparence lorsqu'il est pressé.
<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
<item Android:state_focused="true" Android:state_pressed="false" Android:drawable="@drawable/map_toolbar_details_selected" />
<item Android:state_focused="true" Android:state_pressed="true" Android:drawable="@drawable/map_toolbar_details_selected" />
<item Android:state_focused="false" Android:state_pressed="true" Android:drawable="@drawable/map_toolbar_details_selected" />
<item Android:drawable="@drawable/map_toolbar_details" />
Cela fonctionne pour moi:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
<!-- NOTE: order is important (the first matching state(s) is what is rendered) -->
<item
Android:state_selected="true"
Android:drawable="@drawable/info_icon_solid_with_shadow" />
<item
Android:drawable="@drawable/info_icon_outline_with_shadow" />
</selector>
Et puis en Java:
//assign the image in code (or you can do this in your layout xml with the src attribute)
imageButton.setImageDrawable(getBaseContext().getResources().getDrawable(R.drawable....));
//set the click listener
imageButton.setOnClickListener(new OnClickListener() {
public void onClick(View button) {
//Set the button's appearance
button.setSelected(!button.isSelected());
if (button.isSelected()) {
//Handle selected state change
} else {
//Handle de-select state change
}
}
});
Pour une transition en douceur, vous pouvez également mentionner le temps d'animation:
<selector xmlns:Android="http://schemas.Android.com/apk/res/Android" Android:exitFadeDuration="@Android:integer/config_mediumAnimTime">
ToggleImageButton
qui implémente l'interface Checkable
et supporte OnCheckedChangeListener
et Android:checked
attribut xml:
public class ToggleImageButton extends ImageButton implements Checkable {
private OnCheckedChangeListener onCheckedChangeListener;
public ToggleImageButton(Context context) {
super(context);
}
public ToggleImageButton(Context context, AttributeSet attrs) {
super(context, attrs);
setChecked(attrs);
}
public ToggleImageButton(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
setChecked(attrs);
}
private void setChecked(AttributeSet attrs) {
TypedArray a = getContext().obtainStyledAttributes(attrs, R.styleable.ToggleImageButton);
setChecked(a.getBoolean(R.styleable.ToggleImageButton_Android_checked, false));
a.recycle();
}
@Override
public boolean isChecked() {
return isSelected();
}
@Override
public void setChecked(boolean checked) {
setSelected(checked);
if (onCheckedChangeListener != null) {
onCheckedChangeListener.onCheckedChanged(this, checked);
}
}
@Override
public void toggle() {
setChecked(!isChecked());
}
@Override
public boolean performClick() {
toggle();
return super.performClick();
}
public OnCheckedChangeListener getOnCheckedChangeListener() {
return onCheckedChangeListener;
}
public void setOnCheckedChangeListener(OnCheckedChangeListener onCheckedChangeListener) {
this.onCheckedChangeListener = onCheckedChangeListener;
}
public static interface OnCheckedChangeListener {
public void onCheckedChanged(ToggleImageButton buttonView, boolean isChecked);
}
}
res/values / attrs.xml:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="ToggleImageButton">
<attr name="Android:checked" />
</declare-styleable>
</resources>
La meilleure façon de faire cela sans plus d'images:
public static void buttonEffect(View button){
button.setOnTouchListener(new OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN: {
v.getBackground().setColorFilter(0xe0f47521,PorterDuff.Mode.SRC_ATOP);
v.invalidate();
break;
}
case MotionEvent.ACTION_UP: {
v.getBackground().clearColorFilter();
v.invalidate();
break;
}
}
return false;
}
});
}
Essaye ça:
<item
Android:state_focused="true"
Android:state_enabled="true"
Android:drawable="@drawable/map_toolbar_details_selected" />
Aussi pour les couleurs j'ai eu du succès avec
<selector
xmlns:Android="http://schemas.Android.com/apk/res/Android">
<item
Android:state_selected="true"
Android:color="@color/primary_color" />
<item
Android:color="@color/secondary_color" />
</selector>
Créez un fichier XML dans un dossier res/drawable
. Par exemple, "btn_image.xml":
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
<item Android:drawable="@drawable/bg_state_1"
Android:state_pressed="true"
Android:state_selected="true"/>
<item Android:drawable="@drawable/bg_state_2"
Android:state_pressed="true"
Android:state_selected="false"/>
<item Android:drawable="@drawable/bg_state_selected"
Android:state_selected="true"/>
<item Android:drawable="@drawable/bg_state_deselected"/>
</selector>
Vous pouvez combiner les fichiers de votre choix. Par exemple, remplacez "bg_state_1" par "bg_state_deselected" et "bg_state_2" par "bg_state_selected".
Dans n'importe lequel de ces fichiers, vous pouvez écrire quelque chose comme:
<shape xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:shape="rectangle">
<solid Android:color="#ccdd00"/>
<corners Android:radius="5dp"/>
</shape>
Créez dans un fichier de mise en page un ImageView ou ImageButton avec les attributs suivants:
<ImageView
Android:id="@+id/image"
Android:layout_width="50dp"
Android:layout_height="50dp"
Android:adjustViewBounds="true"
Android:background="@drawable/btn_image"
Android:padding="10dp"
Android:scaleType="fitCenter"
Android:src="@drawable/star"/>
Plus tard dans le code:
image.setSelected(!image.isSelected());