Android (Xamarin) selectableItemBackground - SetBackgroundResource 不能与 SetImageResource 一起使用

Android (Xamarin) selectableItemBackground - SetBackgroundResource not working with SetImageResource

我正在使用创建图像按钮并将它们显示在 activity 上的自定义网格适配器,使用方法 SetImageResource() 设置按钮的源图像。

但是,当点击这些按钮时,这些按钮没有预期的按钮效果 click/ripple。环顾四周后,我找到了几个解决方案,利用 TypedValueSetBackgroundResource(),或者利用 TypedArraySetBackgroundDrawable()。没有图像资源,这两种方法都有效,但添加图像资源后,selectableItemBackground 效果消失。

代码如下:

ImageButton button;

if (convertView == null)
{
    LayoutInflater inflater = (LayoutInflater)context.GetSystemService(Context.LayoutInflaterService);

    //  Grid buttons
    convertView = inflater.Inflate(Resource.Layout.sublayout_Menu_Button, null);

    button = convertView.FindViewById<ImageButton>(Resource.Id.mainMenu_ImgBtn);

    button.SetMinimumHeight(Main_Menu.GRID_HEIGHT / numRows);

    TypedValue tv = new TypedValue();
    context.Theme.ResolveAttribute(Resource.Attribute.selectableItemBackground, tv, true);
    button.SetBackgroundResource(tv.ResourceId);

    //  This code is another method that works similarly to the above                
    //int[] attrs = new int[] { Android.Resource.Attribute.SelectableItemBackground };
    //TypedArray ta = context.ObtainStyledAttributes(attrs);
    //Drawable drawableFromTheme = ta.GetDrawable(0);
    //ta.Recycle();
    //button.SetBackgroundDrawable(drawableFromTheme);

    button.SetImageResource(buttonImages[position]);

    switch (position)
    {
        case 0:
            button.Click += delegate
            {
                Intent intent = new Intent(context, typeof(Select_Hospital));
                context.StartActivity(intent);
            };
            break;

        case 1:
            button.Click += delegate
            {
                Intent intent = new Intent(context, typeof(My_Appointments));
                context.StartActivity(intent);
            };
            break;

        case 2:
            button.Click += delegate
            {
                Intent intent = new Intent(context, typeof(Treatment_Information));
                context.StartActivity(intent);
            };
            break;

        case 3:
            button.Click += delegate
            {
                Intent intent = new Intent(context, typeof(Search));
                context.StartActivity(intent);
            };
            break;
    }
}

我该如何解决这个问题?非常感谢任何帮助!

--编辑--

MyImageButton 代码:

class MyImageButton : ImageButton, IOnTouchListener
{
    private Context context;

    public MyImageButton(Context context, IAttributeSet attrs) : base(context, attrs)
    {
        this.context = context;
        this.SetOnTouchListener(this);
    }

    public bool OnTouch(View v, MotionEvent e)
    {
        if (e.Action == MotionEventActions.Down)
        {
            ImageView iv = (ImageView)v;
            iv.SetColorFilter(new Android.Graphics.Color(context.GetColor(Resource.Color._5_grey)));
        }
        else if (e.Action == MotionEventActions.Up)
        {
            ImageView iv = (ImageView)v;
            iv.ClearColorFilter();
        }
        return true;
    }
};

AXML:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <Dental_IT.Droid.Adapters.MyImageButton
        android:id="@+id/mainMenu_ImgBtn"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:scaleType="centerCrop"
        android:background="@null" />
</LinearLayout>

when clicked, these buttons do not have the desired button click/ripple effect.

点击ImageButton时确实有按钮click/ripple效果,但是被图片遮住了

您可以自定义一个ImageButton来处理触摸事件,当收到点击事件时,您可以在图像上添加一个ColorFilter来实现您的click/ripple效果。

这是我的代码:

public class MyImageButton : ImageButton
{
    public float[] BT_SELECTED_DARK = new float[] { 1, 0, 0, 0, -50, 0, 1,
            0, 0, -50, 0, 0, 1, 0, -50, 0, 0, 0, 1, 0 };

    public MyImageButton(Context context, IAttributeSet attrs):base(context,attrs)
    {
    }

    public override bool OnTouchEvent(MotionEvent e)
    {
        if (e.Action == MotionEventActions.Down)
        {
            this.SetColorFilter(new ColorMatrixColorFilter(BT_SELECTED_DARK));
        }
        else if (e.Action == MotionEventActions.Up)
        {
            this.ClearColorFilter();
        }
        return base.OnTouchEvent(e);
    }
}

添加图片资源时:

button.SetImageResource(Resource.Drawable.download);
button.Click += (sender, e) =>
{
    Toast.MakeText(this,"Hi, I am York!",ToastLength.Short).Show();
};

效果: