it-swarm.com.de

Wie kann ich einen Bildeffekt-Klickeffekt wie eine Schaltfläche in Android geben?

Ich habe imageview in meiner Android-App, die ich wie eine Schaltfläche mit dem angegebenen onClick-Ereignis verwende, aber wie Sie vielleicht meinen, hat imageview beim Klicken keinen anklickbaren Effekt. Wie kann ich das erreichen?

76
Burak Dede

Sie können verschiedene Bilder für angeklickte/nicht angeklickte Zustände entwerfen und wie folgt im onTouchListener 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 in der Veranstaltung:

v.setOnTouchListener(new OnTouchListener() {
            @Override
            public boolean onTouch(View arg0, MotionEvent arg1) {
                v.setSelected(arg1.getAction()==MotionEvent.ACTION_DOWN);
                return true;
            }
        });
51

Sie können dies mit einem einzelnen Bild tun, indem Sie etwa Folgendes verwenden:

     //get the image view
    ImageView imageView = (ImageView)findViewById(R.id.ImageView);

    //set the ontouch listener
    imageView.setOnTouchListener(new OnTouchListener() {

        @Override
        public boolean onTouch(View v, MotionEvent event) {

            switch (event.getAction()) {
                case MotionEvent.ACTION_DOWN: {
                    ImageView view = (ImageView) v;
                    //overlay is black with transparency of 0x77 (119)
                    view.getDrawable().setColorFilter(0x77000000,PorterDuff.Mode.SRC_ATOP);
                    view.invalidate();
                    break;
                }
                case MotionEvent.ACTION_UP:
                case MotionEvent.ACTION_CANCEL: {
                    ImageView view = (ImageView) v;
                    //clear the overlay
                    view.getDrawable().clearColorFilter();
                    view.invalidate();
                    break;
                }
            }

            return false;
        }
    });

Ich werde dies wahrscheinlich in eine Unterklasse von ImageView (oder ImageButton, da es sich ebenfalls um eine Unterklasse von ImageView handelt) zur einfacheren Wiederverwendbarkeit machen, aber dies sollte es Ihnen ermöglichen, einen "ausgewählten" Look auf eine Bildansicht anzuwenden.

71
Mr Zorn

Es ist möglich, mit nur einer Bilddatei mit der ColorFilter-Methode zu arbeiten. ColorFilter erwartet jedoch, dass Sie mit ImageViews und nicht mit Buttons arbeiten. Sie müssen also Ihre Buttons in ImageViews umwandeln. Dies ist zwar kein Problem, wenn Sie Bilder als Schaltflächen verwenden, aber es ist ärgerlicher, wenn Sie Text haben. Wie auch immer, vorausgesetzt, Sie finden ein Problem mit Text.

ImageView button = (ImageView) findViewById(R.id.button);
button.setColorFilter(0xFFFF0000, PorterDuff.Mode.MULTIPLY);

Dadurch wird die Schaltfläche rot überlagert (der Farbcode ist der Hex-Code für vollständig undurchsichtiges Rot - die ersten beiden Ziffern sind Transparenz, dann RR GG BB).

43
AZ_

EDIT: Auch wenn die ursprüngliche Antwort unten funktioniert und einfach einzurichten ist, lesen Sie diesen Beitrag von einem Android Developer Advocate bei Google, wenn Sie eine effizientere Implementierung wünschen/benötigen. Beachten Sie auch, dass das Attribut Android:foregroundfür alle Ansichten einschließlich ImageView standardmäßig in Android M ist.


Das Problem bei der Verwendung eines Selektors für ImageView ist, dass Sie ihn nur als Hintergrund festlegen können. Solange Ihr Bild undurchsichtig ist, wird der Effekt des Selektors nicht dahinter angezeigt.

Der Trick besteht darin, ImageView in ein FrameLayout mit dem Attribut Android:foreground einzuwickeln, mit dem wir ein overlay für seinen Inhalt definieren können. Wenn wir Android:foreground auf einen Selektor setzen (z. B.?android:attr/selectableItemBackground für API-Level 11+) und die OnClickListener anstelle von ImageView an das FrameLayout anhängen, wird das Bild mit dem Drawable unseres Selektors überlagert.

Erblicken:

<FrameLayout
    Android:id="@+id/imageButton"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:foreground="?android:attr/selectableItemBackground" >

    <ImageView
        Android:layout_width="match_parent"
        Android:layout_height="match_parent"
        Android:src="@drawable/yourImageFile" />

</FrameLayout>

(Beachten Sie, dass dies in Ihrem übergeordneten Layout platziert werden sollte.)

final View imageButton = findViewById(R.id.imageButton);
imageButton.setOnClickListener(new OnClickListener(){
    @Override
    public void onClick(View view) {
        // do whatever we wish!
    }
});
38
justasm

Verwenden Sie style = "? Android: borderlessButtonStyle" in der XML-Datei. Es wird der Android-Klickeffekt angezeigt. 

<ImageView
    Android:id="@+id/imageView1"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:src="@drawable/ic_launcher" 
    style="?android:borderlessButtonStyle"
/>
24
Anjula

Verwenden Sie einfach einen ImageButton .

21
kcoppock

Hier ist mein einfacher Weg, das zu lösen:

ImageView iv = (ImageView) findViewById(R.id.imageView);

iv.setOnClickListener(new OnClickListener() {

    @Override
    public void onClick(View arg0) {
        // TODO Auto-generated method stub
        //Agrega porcentajes de cada fraccion de grafica pastel

        Animation animFadein = AnimationUtils.loadAnimation(getApplicationContext(),R.anim.fade_in);

        iv.startAnimation(animFadein);
    });

In der Datei res/anim/fade_in.xml:

<?xml version="1.0" encoding="utf-8"?>
    <set xmlns:Android="http://schemas.Android.com/apk/res/Android"
         Android:fillAfter="true" >

<alpha
    Android:duration="100"
    Android:fromAlpha="0.0"
    Android:interpolator="@Android:anim/accelerate_interpolator"
    Android:toAlpha="1.0" />
 </set>
13

Zur Definition der Auswahlmöglichkeit des Wählers

<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>

Ich muss Android: state_pressed anstelle von Android: state_selected verwenden

<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <item Android:state_pressed ="true"   
        Android:drawable="@drawable/img_down" />
    <item Android:state_pressed ="false"   
        Android:drawable="@drawable/img_up" />
</selector>
6
worawee.s

Legen Sie den wählbaren Hintergrund für ImageView fest und fügen Sie etwas Abstand hinzu Dann befestigen Sie die OnClickListener.

<ImageView
    Android:id="@+id/your_image_view"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:src="@drawable/your_image"
    Android:padding="10dp"
    Android:background="?android:attr/selectableItemBackground"/>
6
Oliver Kranz

Basierend auf der Antwort von Herrn Zorn benutze ich eine statische Methode in meiner abstrakten Utility-Klasse:

public abstract class Utility {
...

    public static View.OnTouchListener imgPress(){
        return imgPress(0x77eeddff); //DEFAULT color
    }

    public static View.OnTouchListener imgPress(final int color){
        return new View.OnTouchListener() {

            @Override
            public boolean onTouch(View v, MotionEvent event) {

                switch(event.getAction()) {

                    case MotionEvent.ACTION_DOWN: {
                        ImageView view = (ImageView) v;
                        view.getDrawable().setColorFilter(color, PorterDuff.Mode.SRC_ATOP);
                        view.invalidate();
                        break;
                    }

                    case MotionEvent.ACTION_UP:
                        v.performClick();

                    case MotionEvent.ACTION_CANCEL: {
                        ImageView view = (ImageView) v;

                        //Clear the overlay
                        view.getDrawable().clearColorFilter();
                        view.invalidate();
                        break;
                    }
                }

                return true;
            }
        };
    }

    ...
}

Dann benutze ich es mit onTouchListener:

ImageView img=(ImageView) view.findViewById(R.id.image);
img.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) { /* Your click action */ }
});
img_zc.setOnTouchListener(Utility.imgPress()); //Or Utility.imgPress(int_color_with_alpha)

Es ist sehr einfach, wenn Sie viele Bilder haben und einen einfachen onTouch-Effekt wünschen, ohne dass XML gezeichnet werden muss und nur ein Bild vorhanden ist.

4
neoteknic

Ich mache einige ähnliche Dinge. Für Sie geeignet oder nicht

Press Effect Helper anzeigen:

  • verwendung: Führen Sie einige einfache Druckeffekte wie iOS aus

    Einfache Verwendung: 

  • ImageView img = (ImageView) findViewById (R.id.img);

  • ViewPressEffectHelper.attach (img)

https://Gist.github.com/extralam/7489370

4
Ah Lam

Sie können setPressed in der ImageView überschreiben und dort die Farbfilterung durchführen, anstatt onTouchEvent-Listener zu erstellen: 

@Override
public void setPressed(boolean pressed) {
    super.setPressed(pressed);

    if(getDrawable() == null)
        return;

    if(pressed) {
        getDrawable().setColorFilter(0x44000000, PorterDuff.Mode.SRC_ATOP);
        invalidate();
    }
    else {
        getDrawable().clearColorFilter();
        invalidate();
    }
}
4
ono

In Kombination mit allen obigen Antworten wollte ich, dass ImageView gedrückt und der Status geändert wird. Wenn sich der Benutzer dann bewegt, "Abbrechen" und keinen OnClickListener ausführen.

Am Ende erstellte ich ein Point-Objekt innerhalb der Klasse und stellte seine Koordinaten entsprechend dem Zeitpunkt ein, zu dem der Benutzer die ImageView nach unten gedrückt hatte. Beim MotionEvent.ACTION_UP zeichnete ich einen neuen Punkt auf und verglich die Punkte.

Ich kann es nur so gut erklären, aber ich habe es so gemacht.

// set the ontouch listener
weatherView.setOnTouchListener(new OnTouchListener() {

    @Override
    public boolean onTouch(View v, MotionEvent event) {
        // Determine what action with a switch statement
        switch (event.getAction()) {

        // User presses down on the ImageView, record the original point
        // and set the color filter
        case MotionEvent.ACTION_DOWN: {
            ImageView view = (ImageView) v;

            // overlay is black with transparency of 0x77 (119)
            view.getDrawable().setColorFilter(0x77000000,
                    PorterDuff.Mode.SRC_ATOP);
            view.invalidate();

            p = new Point((int) event.getX(), (int) event.getY());
            break;
        }

        // Once the user releases, record new point then compare the
        // difference, if within a certain range perform onCLick
        // and or otherwise clear the color filter
        case MotionEvent.ACTION_UP: {
            ImageView view = (ImageView) v;
            Point f = new Point((int) event.getX(), (int) event.getY());
            if ((Math.abs(f.x - p.x) < 15)
                    && ((Math.abs(f.x - p.x) < 15))) {
                view.performClick();
            }
            // clear the overlay
            view.getDrawable().clearColorFilter();
            view.invalidate();
            break;
        }
        }
        return true;
    }
});

Ich habe einen onClickListener in imageView gesetzt, aber dies kann eine Methode sein.

4
samschwartz96

Sie könnten mit Android:background="@Android:drawable/list_selector_background" versuchen, den gleichen Effekt wie "Alarm hinzufügen" im Standard "Wecker" (jetzt Tischuhr) zu erzielen.

4
Marco Bettiol

Das hat für mich funktioniert:

img.setOnTouchListener(new OnTouchListener(){

            @Override
            public boolean onTouch(View v, MotionEvent event) {
                switch (event.getAction())
                {
                    case MotionEvent.ACTION_DOWN:
                    {
                        ((ImageView)v).setImageAlpha(200);
                        break;
                    }
                    case MotionEvent.ACTION_MOVE:
                    {
                        // if inside bounds
                        if(event.getX() > 0 && event.getX() < v.getWidth() && event.getY() > 0 && event.getY() < v.getHeight())
                        {
                            ((ImageView)v).setImageAlpha(200);
                        }
                        else
                        {
                            ((ImageView)v).setImageAlpha(255);
                        }

                        break;
                    }
                    case MotionEvent.ACTION_UP:
                    {
                        ((ImageView)v).setImageAlpha(255);
                    }
                }
                return true;
            }

        });

@Edit: Wie Gunhan sagte, gibt es ein Abwärtskompatibilitätsproblem mit der setImageAlpha-Methode. Ich habe diese Methode verwendet:

public static void setImageAlpha(ImageView img, int alpha)
    {
        if(Build.VERSION.SDK_INT > 15)
        {
            img.setImageAlpha(alpha);
        }
        else
        {
            img.setAlpha(alpha);
        }
    }
4
altosh

Ich erstelle Beispiel hier , ändere einfach ImageView in ClickableImageView aus Ihrem Layout. Ich hoffe es hilft. 

enter image description here

3
thanhbinh84

Verwenden Sie einen Android.widget.Button und setzen Sie seine background-Eigenschaft auf einen Android.graphics.drawable.StateListDrawable. Dies kann alles in XML oder programmgesteuert erfolgen. Siehe den Abschnitt " Custom Button" im Lernprogramm "Form Stuff"

3
Ozone

Ich habe eine schönere Lösung, wenn Sie Hintergrundbilder verwenden :)

public static void blackButton(View button){
    button.setOnTouchListener(new OnTouchListener() {

        public boolean onTouch(View v, MotionEvent event) {
            switch (event.getAction()) {
                case MotionEvent.ACTION_DOWN: {
                    v.getBackground().setColorFilter(0xf0f47521,PorterDuff.Mode.SRC_ATOP);
                    v.invalidate();
                    break;
                }
                case MotionEvent.ACTION_UP: {
                    v.getBackground().clearColorFilter();
                    v.invalidate();
                    break;
                }
            }
            return false;
        }
    });
}
2
András

ODER:

Sie können dieses Formular mit der Image-Schaltfläche verwenden.

Datei res/drawable/btn_video.xml erstellen:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <item Android:drawable="@drawable/image"
        Android:state_pressed="true" />
    <item Android:drawable="@drawable/ico2"
        Android:state_focused="true" />
    <item Android:drawable="@drawable/ico2" />
</selector>

Und res/layout/activity_main.xml:

<ImageButton
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:id="@+id/imageButton"
    Android:layout_gravity="center_horizontal"
    Android:onClick="eventImageBtn"
    Android:background="@drawable/btn_video"
    Android:adjustViewBounds="true"
    Android:scaleType="fitXY"
/>

Ihr Bild ändert sich mit einem Klick und Sie können es mit einem linearen Layout anpassen:

<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:fillViewport="true">

    <LinearLayout
        Android:layout_width="match_parent"
        Android:layout_height="match_parent"
        Android:orientation="vertical"
        Android:background="@color/menu_item_background">

        <LinearLayout Android:layout_width="match_parent" Android:layout_height="match_parent" Android:orientation="vertical"
                      Android:paddingLeft="@dimen/main_screen_side_padding" Android:paddingRight="@dimen/main_screen_side_padding" Android:paddingTop="@dimen/main_screen_side_padding" Android:paddingBottom="@dimen/main_screen_side_padding"
                      Android:background="#ffb3ff13" Android:weightSum="10.00">


            <LinearLayout Android:layout_weight="2.50" Android:background="#ff56cfcd" Android:orientation="vertical" Android:layout_width="fill_parent" Android:layout_height="0dp" >

                <ImageButton
                    Android:layout_width="match_parent"
                    Android:layout_height="match_parent"
                    Android:id="@+id/imageButton"
                    Android:layout_gravity="center_horizontal"
                    Android:onClick="eventImageBtn"
                    Android:background="@drawable/btn_video"
                    Android:adjustViewBounds="true"
                    Android:scaleType="fitXY"
                />
            </LinearLayout>

            <LinearLayout Android:layout_weight="0.50" Android:layout_height="0dp" Android:background="#ffffffff" Android:orientation="vertical" Android:layout_width="fill_parent" >
            </LinearLayout>

            <LinearLayout Android:layout_weight="4.50" Android:orientation="vertical" Android:layout_width="fill_parent" Android:layout_height="0dp" Android:background="#ff8aa5ff">
            </LinearLayout>

            <LinearLayout Android:layout_weight="0.50" Android:layout_height="0dp" Android:background="#ffffffff" Android:orientation="vertical" Android:layout_width="fill_parent" >
            </LinearLayout>

            <LinearLayout Android:layout_weight="2.00" Android:orientation="vertical" Android:layout_width="fill_parent" Android:layout_height="0dp" Android:background="#ffff7d1a" >
            </LinearLayout>

        </LinearLayout>
    </LinearLayout>
</ScrollView>
2
Alex Zaraos

Ich habe versucht mit:

<ImageButton
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:contentDescription="@string/get_started"
        Android:src="@drawable/home_started"
        style="?android:borderlessButtonStyle"
        Android:adjustViewBounds="true"
        Android:clickable="true"
        Android:elevation="5dp"
        Android:longClickable="true" />

und das hat funktioniert. Bitte beachten Sie in der Zeile: style="?android:borderlessButtonStyle"

1
aviit

Wenn Sie beim Tippen eine Welligkeit wünschen, kann dies durch folgenden Code gegeben werden

<ImageView
    ...
    Android:background="?attr/selectableItemBackgroundBorderless"
    Android:clickable="true"
    ...
</ImageView>

Ebenso können Sie einen Klick-Effekt für TextView implementieren

<TextView
    ...
    Android:background="?attr/selectableItemBackgroundBorderless"
    Android:clickable="true"
    ...
</TextView>
1
npk

Danke für die Hilfe zu diesem Thread. Sie haben jedoch eines verpasst ... Sie müssen auch mit ACTION_CANCEL umgehen. Andernfalls wird der Alpha-Wert von ImageView möglicherweise nicht ordnungsgemäß wiederhergestellt, wenn eine übergeordnete Ansicht in der Ansichtshierarchie ein Berührungsereignis abfängt.

Hier ist eine vollständige Klasse, die auf der obigen Klasse basiert, sich aber auch um ACTION_CANCEL kümmert. Es verwendet eine ImageViewCompat-Helfer-Klasse, um die Unterschiede in der Pre-Post-JellyBean-API auszugleichen.

public class ChangeAlphaOnPressedTouchListener implements OnTouchListener {

    private final float pressedAlpha;

    public ChangeAlphaOnPressedTouchListener(float pressedAlpha) {
        this.pressedAlpha = pressedAlpha;
    }

    @Override
    public boolean onTouch(View v, MotionEvent event) {
        ImageView iv = (ImageView) v;
        switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            ImageViewCompat.setAlpha(iv, pressedAlpha);
            break;

        case MotionEvent.ACTION_MOVE:
            if (isInsideViewBounds(v, event)) {
                ImageViewCompat.setAlpha(iv, pressedAlpha);
            } else {
                ImageViewCompat.setAlpha(iv, 1f);
            }
            break;
        case MotionEvent.ACTION_UP:
            ImageViewCompat.setAlpha(iv, 1f);
            break;
        case MotionEvent.ACTION_CANCEL:
            ImageViewCompat.setAlpha(iv, 1f);
        }
        return false;
    }

    private static boolean isInsideViewBounds(View v, MotionEvent event) {
        return event.getX() > 0 && event.getX() < v.getWidth() && event.getY() > 0
                && event.getY() < v.getHeight();
    }
}
1
Matt Accola

Dies ist die beste Lösung, die ich je gesehen habe. Es ist allgemeiner

    <?xml version="1.0" encoding="utf-8"?>
    <set xmlns:Android="http://schemas.Android.com/apk/res/Android"
         Android:fillAfter="true" >

<alpha
    Android:duration="100"
    Android:fromAlpha="0.0"
    Android:interpolator="@Android:anim/accelerate_interpolator"
    Android:toAlpha="1.0" />
 </set>
1
Nilesh

Ich denke, der einfachste Weg ist das Erstellen einer neuen XML-Datei. In diesem Fall nennen wir es "example.xml" im drawable-Ordner und geben den folgenden Code ein:

<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <item Android:drawable="@color/blue"
          Android:state_pressed="true" />

</selector>

Zuvor müssen Sie jedoch die Farben in der Datei colors.xml im Ordner "values" wie folgt festlegen:

<resources>
    <color name="blue">#0000FF</color>
</resources>

Nachdem Sie den Button/ImageButton so eingestellt haben, dass er das neue Layout verwendet, gehen Sie folgendermaßen vor:

<ImageView
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:background="@drawable/example"
/>

Wenn Sie dann auf dieses Bild klicken, ändert sich die Farbe in

<item Android:drawable="@color/blue"
      Android:state_pressed="true" />

geben Sie das gewünschte Feedback ...

1
Lima Neto

Ich denke ImageButton ist eine bessere Lösung

<ImageButton
    Android:layout_width="96dp"
    Android:layout_height="56dp"
    Android:src="@mipmap/ic_launcher"
    Android:adjustViewBounds="true"
    Android:background="@Android:color/transparent"
    Android:foreground="@drawable/selector" />
1
Dan Alboteanu

Hier ist meine Lösung, die mit der Bibliothek " nineOldAndroids " auch alte APIs unterstützt:

rootView.setOnTouchListener(new OnTouchListener() {

    @Override
    public boolean onTouch(final View v, final MotionEvent event) {

        switch (event.getAction()) {

            case MotionEvent.ACTION_UP:
            case MotionEvent.ACTION_CANCEL:
                v.setBackgroundResource(R.drawable.listview_normal);
                ViewHelper.setAlpha(imageView, 1);
                break;

            case MotionEvent.ACTION_DOWN:
                v.setBackgroundResource(0);
                v.setBackgroundColor(getResources().getColor(R.color.listview_pressed));
                ViewHelper.setAlpha(imageView, 0.75f);
                break;
        }
        return false;
    }
});

Es wird davon ausgegangen, dass rootView die Zelle selbst (das Layout) ist und dass es eine einzelne ImageView hat, 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 bearbeiten, und "android: attr/selectableItemBackground" einstellen. Es gibt eine Bibliothek für diese hier und ein Tutorial, wie Sie dies für jede Ansicht tun, die Sie möchten, hier .

1

Hier ist mein Code. Die Idee ist, dass ImageView einen Farbfilter erhält, wenn der Benutzer es 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 überClickEvent . Worawee.s und kcoppock (mit ImageButton) -Lösung verfügt, die Hintergrund erfordert, was keinen Sinn macht, wenn ImageView nicht transparent ist.

Dies ist eine Erweiterung von AZ_ Idee zum Farbfilter.

class PressedEffectStateListDrawable extends StateListDrawable {

    private int selectionColor;

    public PressedEffectStateListDrawable(Drawable drawable, int selectionColor) {
        super();
        this.selectionColor = selectionColor;
        addState(new int[] { Android.R.attr.state_pressed }, drawable);
        addState(new int[] {}, drawable);
    }

    @Override
    protected boolean onStateChange(int[] states) {
        boolean isStatePressedInArray = false;
        for (int state : states) {
            if (state == Android.R.attr.state_pressed) {
                isStatePressedInArray = true;
            }
        }
        if (isStatePressedInArray) {
            super.setColorFilter(selectionColor, PorterDuff.Mode.MULTIPLY);
        } else {
            super.clearColorFilter();
        }
        return super.onStateChange(states);
    }

    @Override
    public boolean isStateful() {
        return true;
    }
}

verwendungszweck:

Drawable drawable = new FastBitmapDrawable(bm);
imageView.setImageDrawable(new PressedEffectStateListDrawable(drawable, 0xFF33b5e5));
1
Malachiasz

Fügen Sie einfach das XML-Attribut Android hinzu: clickable = "true" ...

0

Ich habe folgendes in XML gemacht - mit 0 padding um das Bild und Ripple ontop des Bildes:

<ImageView
    Android:layout_width="100dp"
    Android:layout_height="100dp"
    Android:background="@drawable/my_image"
    Android:clickable="true"
    Android:focusable="true"
    Android:src="?android:attr/selectableItemBackground" />
0