Sie können verschiedene Bilder für angeklickte / nicht angeklickte Zustände entwerfen und diese im onTouchListener wie folgt festlegen
final ImageView v = (ImageView) findViewById(R.id.button0);
v.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View arg0, MotionEvent arg1) {
switch (arg1.getAction()) {
case MotionEvent.ACTION_DOWN: {
v.setImageBitmap(res.getDrawable(R.drawable.img_down));
break;
}
case MotionEvent.ACTION_CANCEL:{
v.setImageBitmap(res.getDrawable(R.drawable.img_up));
break;
}
}
return true;
}
});
Die bessere Wahl ist, dass Sie einen Selektor wie folgt definieren
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_selected="true"
android:drawable="@drawable/img_down" />
<item android:state_selected="false"
android:drawable="@drawable/img_up" />
</selector>
und wählen Sie das Bild im Ereignis aus:
v.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View arg0, MotionEvent arg1) {
v.setSelected(arg1.getAction()==MotionEvent.ACTION_DOWN);
return true;
}
});
MotionEvent.ACTION_DOWN || MotionEvent.ACTION_MOVE
, das Bild so lange anzuzeigen, wie wir drücken.setOnTouchListener(...
. Sie können einfach das erstellen<selector ...>
und dann das ImageView in XML anklickbar machen wie<ImageView ... android:clickable="true" android:focusable="true" android:src="@drawable/my_selector" />
Sie können dies mit einem einzelnen Bild tun, indem Sie Folgendes verwenden:
Ich werde dies wahrscheinlich zu einer Unterklasse von ImageView (oder ImageButton, da es auch eine Unterklasse von ImageView ist) machen, um die Wiederverwendbarkeit zu vereinfachen, aber dies sollte es Ihnen ermöglichen, ein "ausgewähltes" Aussehen auf eine Bildansicht anzuwenden.
quelle
false
, sonst wird das eigentlicheonClick()
Ereignis der Ansicht nicht ausgelöstMit der ColorFilter-Methode ist es möglich, mit nur einer Bilddatei zu arbeiten. ColorFilter erwartet jedoch, dass es mit ImageViews und nicht mit Schaltflächen funktioniert. Daher müssen Sie Ihre Schaltflächen in ImageViews umwandeln. Dies ist ohnehin kein Problem, wenn Sie Bilder als Schaltflächen verwenden, aber es ist ärgerlicher, wenn Sie Text hatten ... Angenommen, Sie finden einen Weg, um das Problem mit Text zu umgehen, ist hier der folgende Code:
Dadurch wird eine rote Überlagerung auf die Schaltfläche angewendet (der Farbcode ist der Hex-Code für vollständig undurchsichtiges Rot - die ersten beiden Ziffern sind Transparenz, dann RR GG BB.).
quelle
BEARBEITEN : Obwohl die ursprüngliche Antwort unten funktioniert und einfach einzurichten ist, lesen Sie diesen Beitrag eines Android Developer Advocate bei Google, wenn Sie eine effizientere Implementierung wünschen / benötigen. Beachten Sie außerdem, dass das
android:foreground
Attribut in Android M standardmäßig für alle Ansichten , einschließlich ImageView, verfügbar ist.Das Problem bei der Verwendung eines Selektors für eine ImageView besteht darin, dass Sie ihn nur als Hintergrund für die Ansicht festlegen können. Solange Ihr Bild undurchsichtig ist, wird der Effekt des Selektors dahinter nicht angezeigt.
Der Trick besteht darin, Ihre ImageView in ein FrameLayout mit dem Attribut zu verpacken, mit dem
android:foreground
wir eine Überlagerung für den Inhalt definieren können. Wenn wirandroid:foreground
einen Selektor?android:attr/selectableItemBackground
festlegen (z. B. für API-Level 11+) undOnClickListener
diesen anstelle der ImageView an das FrameLayout anhängen, wird das Bild mit dem Drawable unseres Selektors überlagert - dem gewünschten Klickeffekt!Erblicken:
(Beachten Sie, dass dies in Ihrem übergeordneten Layout platziert werden sollte.)
quelle
selectableItemBackground
Attribut wurde nur in API-Ebene 11 hinzugefügt. Sie müssen daher einen anderen Selektor verwenden, wenn Sie diese Lösung für ältere API-Ebenen verwenden möchten. Für eine meiner Anwendungen, die API Level 7 unterstützt, verwende ich beispielsweise die@drawable/list_selector_holo_light
Ressource, die mit dem Android Holo Colors Generator-Tool generiert wurde .<ImageButton>
mit selectableItemBackground erreichen!Verwenden Sie style = "? Android: borderlessButtonStyle" in der XML-Datei. Es wird der Standard-Klickeffekt für Android angezeigt.
quelle
android:adjustViewBounds="true"
zum Deaktivieren der Polsterung.style="?android:attr/borderlessButtonStyle"
Verwenden Sie einfach einen ImageButton .
quelle
Hier ist mein einfacher Weg, um das zu lösen:
In Datei
res/anim/fade_in.xml
:quelle
Stellen Sie den auswählbaren Hintergrund auf ImageView ein und fügen Sie einige Auffüllungen hinzu. Dann befestigen Sie die
OnClickListener
.quelle
Zum Definieren der auswählbaren Auswahl des Selektors
Ich muss android: state_pressed anstelle von android: state_selected verwenden
quelle
Sie können versuchen
android:background="@android:drawable/list_selector_background"
, den gleichen Effekt wie "Alarm hinzufügen" im Standard "Wecker" (jetzt Schreibtischuhr) zu erzielen.quelle
Das hat bei mir funktioniert:
@Edit: Wie Gunhan sagte, wird es ein Abwärtskompatibilitätsproblem mit der setImageAlpha-Methode geben. Ich habe diese Methode verwendet:
quelle
Ich mache einige ähnliche Dinge. Passend für dich oder nicht
Presseeffekt-Helfer anzeigen:
Verwendung: Machen Sie einen einfachen Press-Effekt wie iOS
Einfache Verwendung:
ImageView img = (ImageView) findViewById (R.id.img);
https://gist.github.com/extralam/7489370
quelle
In Kombination mit allen obigen Antworten wollte ich, dass die ImageView gedrückt und der Status geändert wird. Wenn sich der Benutzer jedoch bewegt, wird "Abbrechen" ausgeführt und kein onClickListener ausgeführt.
Am Ende habe ich ein Point-Objekt innerhalb der Klasse erstellt und seine Koordinaten entsprechend dem Zeitpunkt festgelegt, zu dem der Benutzer die ImageView gedrückt hat. Auf dem MotionEvent.ACTION_UP zeichne ich einen neuen Punkt auf und vergleiche die Punkte.
Ich kann es nur so gut erklären, aber hier ist, was ich getan habe.
Ich habe einen onClickListener in der imageView festgelegt, aber dies kann eine Methode sein.
quelle
MotionEvent.ACTION_CANCEL
mit der gleichen Funktionalität wieMotionEvent.ACTION_UP
damals ist es möglich, die Ansicht zu "löschen", wenn der Benutzer ein "Ziehen" ausführt, das keine Klickaktion ist.Sie können
setPressed
die ImageView überschreiben und dort die Farbfilterung durchführen, anstatt onTouchEvent-Listener zu erstellen:quelle
Basierend auf der Antwort von Herrn Zorn verwende ich in meiner abstrakten Utility-Klasse eine statische Methode:
Dann benutze ich es mit onTouchListener:
Es ist sehr einfach, wenn Sie viele Bilder haben und einen einfachen onTouch-Effekt wünschen, ohne dass XML gezeichnet werden kann und nur ein Bild.
quelle
Wenn Sie beim Antippen eine Welligkeit wünschen, kann dies durch den folgenden Code angegeben werden:
Ebenso können Sie den Klickeffekt für TextView implementieren
quelle
Verwenden Sie ein
android.widget.Button
und setzen Sie seinebackground
Eigenschaft auf einandroid.graphics.drawable.StateListDrawable
. Dies kann alles in XML oder programmgesteuert erfolgen. Weitere Informationen finden Sie im Abschnitt "Benutzerdefinierte Schaltfläche" des Formular-Lernprogramms .quelle
Ich erstelle hier ein Beispiel , ändere einfach ImageView in ClickableImageView aus deinem Layout. Hoffe es hilft.
quelle
Ich denke, ImageButton ist eine bessere Lösung
quelle
Ich habe eine schönere Lösung, wenn Sie Hintergrundbilder verwenden :)
quelle
ODER:
Sie können dieses Formular mit der Bildschaltfläche verwenden.
Datei erstellen
res/drawable/btn_video.xml
:Und
res/layout/activity_main.xml
:Ihr Bild ändert sich mit einem Klick und Sie können es mit einem linearen Layout anpassen:
quelle
Hier ist meine Lösung, die mit der Bibliothek " NineOldAndroids " auch alte APIs unterstützt:
Es wird davon ausgegangen, dass die RootView die Zelle selbst (das Layout) ist und dass es eine einzelne ImageView gibt, die von der Farbe beeinflusst werden soll, die Sie auf die gesamte Zelle anwenden möchten.
BEARBEITEN: Wenn Sie möchten, können Sie ImageView auch erweitern, um den Vordergrund zu verarbeiten, und es auf "? Android: attr / selectableItemBackground" setzen. Es gibt eine Bibliothek für das hier und eine Anleitung, wie man es für jede Ansicht tun Sie es wünschen, hier .
quelle
Danke für die Hilfe zu diesem Thread. Sie haben jedoch eines verpasst ... Sie müssen auch mit ACTION_CANCEL umgehen. Wenn Sie dies nicht tun, können Sie den Alpha-Wert der ImageView möglicherweise nicht ordnungsgemäß wiederherstellen, falls eine übergeordnete Ansicht in der Ansichtshierarchie ein Berührungsereignis abfängt (denken Sie an eine ScrollView, die Ihre ImageView umschließt).
Hier ist eine vollständige Klasse, die auf der obigen Klasse basiert, sich aber auch um ACTION_CANCEL kümmert. Es verwendet eine ImageViewCompat-Hilfsklasse, um die Unterschiede in der JellyBean-API vor und nach dem Eingriff zu abstrahieren.
quelle
Hier ist mein Code. Die Idee ist, dass ImageView einen Farbfilter erhält, wenn der Benutzer ihn berührt, und der Farbfilter entfernt wird, wenn der Benutzer ihn nicht mehr berührt.
Martin Booka Weser, András, Ah Lam, altosh, Lösung funktioniert nicht, wenn ImageView auch onClickEvent hat. Für die Lösung von worawee.s und kcoppock (mit ImageButton) ist Hintergrund erforderlich, was keinen Sinn macht, wenn ImageView nicht transparent ist.
Dies ist eine Erweiterung der AZ_- Idee zum Farbfilter.
Verwendung:
quelle
Ich habe versucht mit:
und das hat funktioniert. Bitte beachten Sie in der Zeile:
style="?android:borderlessButtonStyle"
quelle
Ich denke, der einfachste Weg ist das Erstellen einer neuen XML-Datei. In diesem Fall nennen wir es "example.xml" im Zeichenordner und geben den folgenden Code ein:
Zuvor müssen Sie jedoch die Farben in der Datei colours.xml im Ordner values wie folgt festlegen:
Dazu haben Sie einfach den Button / ImageButton so eingestellt, dass das neue Layout wie folgt verwendet wird:
Wenn Sie dann auf dieses Bild klicken, ändert es sich in die eingestellte Farbe
Geben Sie das Feedback, das Sie wollen ...
quelle
Dies ist die beste Lösung, die ich je gesehen habe. Es ist allgemeiner.
quelle
Ich habe folgt wie in XML - mit 0 Polsterung um das Bild und Welligkeit ontop des Bildes:
quelle
Im Moment sollten wir die Materialdesignpraxis entwickeln . In diesem Fall können Sie einer ImageView einen Ripple-Effekt hinzufügen.
quelle
Fügen Sie einfach das XML-Attribut android hinzu: clickable = "true" ...
quelle