sous Android alors que je mets l’image d’arrière-plan sur Button, je ne vois aucun effet sur le bouton. J'ai besoin d'un effet sur le bouton pour que l'utilisateur puisse reconnaître que le bouton est cliqué . Le bouton devrait être sombre pendant quelques secondes lorsqu'il a cliqué, que dois-je faire pour cela?
Cela peut être réalisé en créant un fichier XML dessinable contenant une liste d'états pour le bouton. Ainsi, par exemple, si vous créez un nouveau fichier XML appelé "button.xml" avec le code suivant:
<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
<item Android:state_focused="true" Android:state_pressed="false" Android:drawable="@drawable/YOURIMAGE" />
<item Android:state_focused="true" Android:state_pressed="true" Android:drawable="@drawable/gradient" />
<item Android:state_focused="false" Android:state_pressed="true" Android:drawable="@drawable/gradient" />
<item Android:drawable="@drawable/YOURIMAGE" />
</selector>
Pour conserver l'image d'arrière-plan avec un aspect sombre sur la presse, créez un deuxième fichier XML et appelez-le gradient.xml avec le code suivant:
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:Android="http://schemas.Android.com/apk/res/Android" >
<item>
<bitmap Android:src="@drawable/YOURIMAGE"/>
</item>
<item>
<shape xmlns:Android="http://schemas.Android.com/apk/res/Android">
<gradient Android:angle="90" Android:startColor="#880f0f10" Android:centerColor="#880d0d0f" Android:endColor="#885d5d5e"/>
</shape>
</item>
</layer-list>
Dans le xml de votre bouton, définissez l’arrière-plan sur le bouton xml, par exemple.
Android:background="@drawable/button"
J'espère que cela t'aides!
Modifier: le code ci-dessus a été modifié pour afficher une image (YOURIMAGE) dans le bouton, par opposition à une couleur de bloc.
C'est plus simple lorsque vous avez beaucoup de boutons images et que vous ne voulez pas écrire XML-S pour chaque bouton.
Version Kotlin:
fun buttonEffect(button: View) {
button.setOnTouchListener { v, event ->
when (event.action) {
MotionEvent.ACTION_DOWN -> {
v.background.setColorFilter(-0x1f0b8adf, PorterDuff.Mode.SRC_ATOP)
v.invalidate()
}
MotionEvent.ACTION_UP -> {
v.background.clearColorFilter()
v.invalidate()
}
}
false
}
}
Version Java:
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;
}
});
}
Créez votre objet AlphaAnimation
qui détermine l’effet de fondu du bouton, puis laissez-le commencer dans la onClickListener
de vos boutons
Par exemple :
private AlphaAnimation buttonClick = new AlphaAnimation(1F, 0.8F);
// some code
public void onClick(View v) {
v.startAnimation(buttonClick);
}
bien sûr, ceci est juste un moyen, pas le plus préféré, il est juste plus facile
Pour rendre votre élément cohérent avec l'apparence du système, il n'est pas difficile de référencer l'attribut système Android: attr/selectableItemBackground. Par exemple, si vous souhaitez qu'un ImageView dans votre widget apparaisse comme "sélectionnable" avec une mise en surbrillance appropriée, etc.
<ImageView
...
Android:background="?android:attr/selectableItemBackground"
...
/>
Il y en a beaucoup dans Android_sdk_path/plateformes/Android-x. Bonne fouille!
EDIT: J'ai découvert plus tard que cet attribut simple ne réside pas dans SDK <v11. Donc, le meilleur moyen que je connaisse maintenant est de télécharger le pack de modèles appwidget et de l'utiliser.
Ou en utilisant une seule image d'arrière-plan, vous pouvez obtenir l'effet de clic en utilisant setOnTouchListener
Deux manières
((Button)findViewById(R.id.testBth)).setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN: {
Button view = (Button) 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: {
Button view = (Button) v;
view.getBackground().clearColorFilter();
view.invalidate();
break;
}
}
return true;
}
});
Et si vous ne voulez pas utiliser setOnTouchLister
, une autre façon de le faire est
myButton.getBackground().setColorFilter(.setColorFilter(0xF00, Mode.MULTIPLY);
StateListDrawable listDrawable = new StateListDrawable();
listDrawable.addState(new int[] {Android.R.attr.state_pressed}, drawablePressed);
listDrawable.addState(new int[] {Android.R.attr.defaultValue}, myButton);
myButton.setBackgroundDrawable(listDrawable);
Vous pouvez simplement utiliser le premier plan de votre view
pour obtenir un effet cliquable
Android:foreground="?android:attr/selectableItemBackground"
je veux juste ajouter un autre moyen simple de le faire: si votre ImageButton reste son arrière-plan et que vous ne le définissez pas à null, il fonctionnera comme un bouton normal et affichera l'animation du clic en cliquant exactement comme les autres boutons.Le moyen de masquer le fond pendant qu'il est toujours là:
<ImageButton
Android:id="@+id/imageButton2"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:paddingBottom="1dp"
Android:paddingLeft="1dp"
Android:paddingRight="1dp"
Android:paddingTop="1dp"
Android:src="@drawable/squareicon" />
Les marges ne permettent pas que l'arrière-plan soit visible et font en sorte que le bouton se comporte comme les autres boutons.
Step: set a button in XML with onClick Action:
<Button
Android:id="@+id/btnEditUserInfo"
style="?android:borderlessButtonStyle"
Android:layout_width="wrap_content"
Android:layout_height="@dimen/txt_height"
Android:layout_gravity="center"
Android:background="@drawable/round_btn"
Android:contentDescription="@string/image_view"
Android:onClick="edit_user_info"
Android:text="Edit"
Android:textColor="#000"
Android:textSize="@dimen/login_textSize" />
Step: on button clicked show animation point
//pgrm mark ---- ---- ----- ---- ---- ----- ---- ---- ----- ---- ---- -----
public void edit_user_info(View view) {
// show click effect on button pressed
final AlphaAnimation buttonClick = new AlphaAnimation(1F, 0.8F);
view.startAnimation(buttonClick);
Intent intent = new Intent(getApplicationContext(), EditUserInfo.class);
startActivity(intent);
}// end edit_user_info
C’est la meilleure solution que j’ai trouvée en prenant des allusions dans la réponse de @ Vinayak. Toutes les autres solutions présentent des inconvénients différents.
Tout d’abord, créez une fonction comme celle-ci.
void addClickEffect(View view)
{
Drawable drawableNormal = view.getBackground();
Drawable drawablePressed = view.getBackground().getConstantState().newDrawable();
drawablePressed.mutate();
drawablePressed.setColorFilter(Color.argb(50, 0, 0, 0), PorterDuff.Mode.SRC_ATOP);
StateListDrawable listDrawable = new StateListDrawable();
listDrawable.addState(new int[] {Android.R.attr.state_pressed}, drawablePressed);
listDrawable.addState(new int[] {}, drawableNormal);
view.setBackground(listDrawable);
}
Explication:
getConstantState (). newDrawable () est utilisé pour cloner le dessin existant, sinon le même dessin sera utilisé. Lisez plus d’ici: Android: Cloner un dessinable afin de faire un StateListDrawable avec des filtres
mutate () est utilisé pour que le clone Drawable ne partage pas son état avec d'autres instances de Drawable. En savoir plus à ce sujet ici: https://developer.Android.com/reference/Android/graphics/drawable/Drawable.html#mutate ()
Utilisation:
Vous pouvez passer n'importe quel type de View (Button, ImageButton, View etc.) en tant que paramètre de la fonction et ils obtiendront l'effet de clic qui leur est appliqué.
addClickEffect(myButton);
addClickEffect(myImageButton);
Utilisez RippleDrawable pour l’effet appuyé/cliqué sur l’état Material Design.
Pour ce faire, créez un élément d’ondulation en tant que fichier .xml sous/dossier pouvant être dessiné et utilisez-le sous Android: arrière-plan pour n’importe quelle vue.
Effet pour l'icône appuyée/cliquée, utilisez un effet d'entraînement circulaire, par exemple:
<ripple xmlns:Android="http://schemas.Android.com/apk/res/Android" Android:color="@Android:color/darker_gray" />
Effet pour la vue cliquée avec la limite du rectangle, nous pouvons ajouter une ondulation sur le dessin existant comme ci-dessous:
<?xml version="1.0" encoding="utf-8"?> <ripple xmlns:Android="http://schemas.Android.com/apk/res/Android" Android:color="#000000"> <item Android:drawable="@drawable/your_background_drawable"/> </ripple>
Si vous utilisez un fond XML au lieu d'IMG, supprimez simplement ceci:
<item>
<bitmap Android:src="@drawable/YOURIMAGE"/>
</item>
de la première réponse que @Ljdawson nous a donnée.
Faire un ajout mineur à Andràs répond:
Vous pouvez utiliser postDelayed
pour que le filtre de couleur dure pendant une courte période afin de le rendre plus visible:
@Override
public boolean onTouch(final View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN: {
v.getBackground().setColorFilter(color, PorterDuff.Mode.SRC_ATOP);
v.invalidate();
break;
}
case MotionEvent.ACTION_UP: {
v.postDelayed(new Runnable() {
@Override
public void run() {
v.getBackground().clearColorFilter();
v.invalidate();
}
}, 100L);
break;
}
}
return false;
}
Vous pouvez modifier la valeur du délai 100L selon vos besoins.