Как я могу дать эффект просмотра изображения, как кнопка на Android? - PullRequest
77 голосов
/ 06 января 2011

В моем приложении для Android есть изображение, которое я использую как кнопку с указанным событием onClick, но, как вы можете догадаться, оно не дает эффекту просмотра изображения при нажатии.Как мне этого добиться?

Ответы [ 30 ]

1 голос
/ 13 ноября 2015

Я пробовал с:

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

, и это сработало.Обратите внимание на строку: style="?android:borderlessButtonStyle"

1 голос
/ 27 февраля 2013

Спасибо за помощь в этой теме.Тем не менее, вы упустили одну вещь ... вам также нужно обработать ACTION_CANCEL.Если вы этого не сделаете, вы можете неправильно восстановить альфа-значение ImageView в том случае, если родительское представление в иерархии представлений перехватывает событие касания (представьте, что ScrollView оборачивает ваше ImageView).завершите класс, который основан на вышеупомянутом классе, но также заботится о ACTION_CANCEL.Он использует вспомогательный класс ImageViewCompat, чтобы абстрагироваться от различий в API JellyBean до публикации.

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 голос
/ 11 декабря 2016

. Это лучшее решение, которое я когда-либо видел. Его более общий

    <?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 голос
/ 08 марта 2014

Я думаю, что самый простой способ - создать новый XML-файл.В этом случае давайте назовем его «example.xml» в папке drawable и вставим следующий код:

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

</selector>

Но перед этим вы должны установить цвета в файле colors.xml, впапка значений, как это:

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

После этого вы просто устанавливаете Button / ImageButton для использования нового макета, например:

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

Затем, когда вы нажимаете это изображение, он сменится на цвет, установленный в

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

, давая желаемую обратную связь ...

1 голос
/ 08 октября 2018

Я думаю, ImageButton - лучшее решение

<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 голос
/ 17 марта 2014

Вот мое решение, которое, используя библиотеку " nineOldAndroids ", также поддерживает старые API:

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;
    }
});

Предполагается, что rootView является самой ячейкой (макет), и что он имеет один imageView, на который вы хотите повлиять цвет, который вы хотите применить ко всей ячейке.


РЕДАКТИРОВАТЬ: если вы хотите, вы также можете расширить ImageViewдля обработки переднего плана и установите его в «? android: attr / selectableItemBackground».Здесь есть библиотека для этого здесь и учебник о том, как это сделать для любого представления, которое вы хотите, здесь .

1 голос
/ 15 июня 2017

Если вы хотите, чтобы пульсация была нажата, это может быть задано этим кодом:

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

Аналогично, вы можете реализовать эффект щелчка для TextView

<TextView
    ...
    android:background="?attr/selectableItemBackgroundBorderless"
    android:clickable="true"
    ...
</TextView>
0 голосов
/ 26 июля 2018

Просто добавьте атрибут XML, android: clickable = "true" ...

0 голосов
/ 02 декабря 2017

Я сделал следующее в XML - с 0 отступом вокруг изображения и пульсацией поверх изображения:

<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 голосов
/ 05 декабря 2015

На данный момент, мы должны разработать Material Design практика.В этом случае вы можете добавить волновой эффект в ImageView.

...