如何在Android上像按钮一样给imageview点击效果?


84

我在Android应用程序中使用了imageview,就像给定了onClick事件的按钮一样,但是您可能会猜测单击它时没有给imageview提供可点击的效果。我该如何实现?

Answers:


53

您可以为单击/未单击状态设计不同的图像,并在onTouchListener中进行如下设置

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

更好的选择是按如下方式定义选择器

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

并在事件中选择图像:

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

1
您能解释一下res.getDrawable res的作用吗?
VenushkaT 2014年

v.setSelected将仅== true一次,由于MotionEvent.ACTION_MOVE而立即变为false。释放手指后,就会发生MotionEvent.ACTION_UP。如果使用选择器方法,请使用单独的逻辑来setSelected或setPressed。如果(arg1.getAction()== MotionEvent.ACTION_DOWN){v.setPressed(true); }否则,如果(arg1.getAction()== MotionEvent.ACTION_UP){v.setPressed(false); }
Adam Denoon

最好在MotionEvent.ACTION_DOWN || MotionEvent.ACTION_MOVE我们按下时一直保持图像显示。
Alaa M.

您不需要setOnTouchListener(...。您可以简单地创建<selector ...>,然后将XML中的ImageView设置为可点击,例如<ImageView ... android:clickable="true" android:focusable="true" android:src="@drawable/my_selector" />
Pierre

76

您可以使用以下图像处理单个图像:

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

我可能会将其设置为ImageView的子类(或ImageButton也是ImageView的子类),以便更轻松地重用,但是这应允许您将“选定的”外观应用于imageview。


2
我还为ACTION_CANCEL添加了一个保护套,效果很好,谢谢!
艾伦(Alan)

打个招呼-我已经在自己的代码中添加了自己,但也会在此处进行更新。
Zorn先生

1
这可能是另一个问题,但是在ACTION_UP之后如何取消?具体来说...用户点击图片。用户将手指从图像上拖动以取消。但是此代码不会取消操作
sudocoder 2014年

我还将添加
MotionEvent.ACTION_OUTSIDE

3
您可能要返回false,否则视图的实际onClick()事件将不会触发
Nimrod Dayan 2015年

45

使用ColorFilter方法可以只处理一个图像文件。但是,ColorFilter希望使用ImageViews而不是Buttons,因此您必须将按钮转换为ImageViews。如果您还是将图像用作按钮,这不是问题,但是如果您有文本,这会更令人讨厌...无论如何,假设您找到了解决文本问题的方法,请使用以下代码:

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

这会将红色覆盖层应用于按钮(颜色代码是完全不透明的红色的十六进制代码-前两位数字是透明的,然后是RR GG BB。)。


3
您能否解释一下该代码运行后将发生什么以及将在何处调用它?我尝试在imageView初始化上调用这两行-它将我的图像绘制为红色,然后无论单击还是触摸都没有任何反应。触摸通话时相同。
esteewhy

45

编辑:尽管下面的原始答案有效并且易于设置,但是如果您想要/需要更有效的实现,请参阅Google的Android开发者倡导者的这篇文章。另请注意,默认情况下,Android M中的所有视图(包括ImageView)具有该android:foreground属性。


将选择器用于ImageView的问题在于,您只能将其设置为视图的背景-只要图像是不透明的,您就看不到选择器的效果。

诀窍是将ImageView包裹在具有属性的FrameLayout中,该属性android:foreground使我们能够为其内容定义一个叠加层。如果我们设置android:foreground一个选择器(例如,?android:attr/selectableItemBackground针对API级别11+)并将其附加OnClickListener到FrameLayout而不是ImageView,则图像将被我们选择器的drawable覆盖-我们想要的点击效果!

看哪:

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

(请注意,这应该放在您的父级布局中。)

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

2
太好了!这是一个很好的解决方案。联系人应用程序中用于SMS或Call操作的相同解决方案。
2014年

无法在API <11中工作
。android

selectableItemBackground属性仅在API级别11中添加,因此如果要将此解决方案用于较早的API级别,则必须使用另一个选择器。例如,对于我的一个支持API级别7的应用程序,我使用@drawable/list_selector_holo_light通过Android Holo Colors Generator工具生成的资源。
justasm 2014年

您可以仅使用1<ImageButton>和selectableItemBackground来实现相同的行为!
Yohan Dahmani'5

28

在XML文件中使用style =“?android:borderlessButtonStyle”。它将显示Android默认的点击效果。

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

1
这实际上是最好的答案,要容易
得多-FrankMonza

1
这将设置填充,即使将填充设置为0,即使您提供的图像占据整个imageView,也不会看到单击的效果。
Android开发人员

2
@androiddeveloper用于android:adjustViewBounds="true"取消设置填充。
哈菲兹·迪瓦达达里

1
我们推荐使用style="?android:attr/borderlessButtonStyle"developer.android.com/guide/topics/ui/controls/...
哈菲兹Divandari

21

只需使用ImageButton即可


3
我个人无法使其看起来像ImageView。无边框,将图像拉伸到ImageButton等的大小。如果可以给出此边框并拉伸问题,则更新您的帖子。赏金
会给

15

这是我解决此问题的简单方法:

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

在文件中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>

很好的解决方案-谢谢!我滚动浏览了所有简洁的文章,但没有成功。终于我来到了这里,它为我工作。一个观察结果-如果您有2个以上的按钮要将动画应用于..代码,我发现我需要为每个要为其应用效果的按钮创建一个Animation对象的唯一实例。单击1时,重复使用同一实例会使所有按钮闪烁。
Gene Bo

9

将可选背景设置为ImageView并添加一些填充。然后附上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"/>

有没有一种方法可以使用它而不设置填充,而使整个ImageView都具有效果,而不仅仅是空白区域?
Android开发人员

这将显示立方波动,我们需要中心波动
Kishan Solanki

8

用于定义选择器可绘制的选择

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

我必须使用android:state_pressed而不是android:state_selected

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

5

您可以尝试使用与android:background="@android:drawable/list_selector_background" 默认“闹钟”(现在为桌面时钟)中的“添加闹钟”相同的效果。


5

如果您希望在点击时产生波纹,可以通过以下代码给出:

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

同样,您可以为TextView实现点击效果

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

4

这对我有用:

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:正如Gunhan所说,setImageAlpha方法将存在向后兼容性问题。我用这种方法:

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

1
setImageAlpha需要API级16。因此,对于后向兼容的应用其不可能使用它
Gunhan

1
@Gunhan实际上,您可以使用“ nineOldAndroids”库,该库甚至在较旧的API上也允许使用alpha。只需使用:ViewHelper.setAlpha(view,alpha);
Android开发人员

4

我做了一些类似的事情,看是否适合你

查看新闻特效助手:

  • 用法:做一些简单的新闻效果,例如iOS

    简单用法:

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

  • ViewPressEffectHelper.attach(img)

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


4

结合以上所有答案,我希望按下并更改ImageView的状态,但是如果用户移动了,则“取消”并且不执行onClickListener。

我最终在类中制作了一个Point对象,并根据用户按下ImageView的时间设置了它的坐标。在MotionEvent.ACTION_UP上,我记录了一个新点并比较了这些点。

我只能解释得很好,但这就是我所做的。

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

我在imageView上设置了onClickListener,但这可以是一种方法。


通过添加MotionEvent.ACTION_CANCEL具有相同功能的大小写,MotionEvent.ACTION_UP然后在用户执行不是单击操作的“拖动”操作时可以“清除”视图。
曼多·斯塔姆

4

您可以覆盖setPressedImageView并在那里进行颜色过滤,而不是创建onTouchEvent侦听器:

@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

基于Zorn先生的回答,我在抽象的Utility类中使用了静态方法:

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

    ...
}

然后,将它与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)

如果您有很多图像,并且想要一个简单的onTouch效果,而没有任何XML可绘制对象,并且只有一个图像,这将非常简单。




3

我认为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" />

2

如果您使用背景图片,我还有一个更美丽的解决方案:)

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

要么:

您可以通过“图像”按钮使用此表单。

创建文件res/drawable/btn_video.xml

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

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

单击即可更改图像,并且可以使用线性布局进行调整:

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

这是我的解决方案,它使用“ 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”。这里有一个用于此的库,以及关于如何针对您希望的任何视图执行此操作的教程,在此处


@madlymad感谢您修复代码格式,尽管我认为缩进有些问题。无论如何,它足以阅读它...
android开发人员

1

感谢您对此线程的帮助。但是,您错过了一件事...您也需要处理ACTION_CANCEL。如果不这样做,则在视图层次结构中的父视图拦截触摸事件的情况下,您可能无法正确还原ImageView的Alpha值(以ScrollView封装ImageView)。

这是一个基于上述类的完整类,但还要注意ACTION_CANCEL。它使用ImageViewCompat帮助器类抽象出JellyBean API前后的差异。

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

这是我的代码。这个想法是当用户触摸ImageView时会获得滤色器,而当用户停止触摸它时便会删除滤色器。

当ImageView也具有onClickEvent时,Martin Booka Weser,András,Ah Lam,altosh的解决方案不起作用。worawee.s和kcoppock(带有ImageButton)解决方案需要背景,当ImageView不透明时,这是没有意义的。

这是AZ_关于滤色镜的想法的扩展。

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

用法:

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

1

我尝试了:

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


在padding为0的情况下不起作用,并且图像占据了视图的整个区域。
Android开发人员

1

我认为最简单的方法是创建一个新的XML文件。在这种情况下,我们在drawable文件夹中将其称为“ example.xml”,并输入以下代码:

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

</selector>

但是在此之前,您必须在values.xml文件的values文件夹中设置颜色,如下所示:

<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

这是我见过的最好的解决方案。它更通用。

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

2
应该在哪里注入文件?
DmitryBoyko '18

0

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


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.