我正在使用自定义网格适配器创建图像按钮并在活动上显示它们,使用SetImageResource()
方法设置按钮的src图像。
但是,单击时,这些按钮没有所需的按钮单击/波纹效果。环顾四周后,我找到了几个解决方案,使用TypedValue
SetBackgroundResource()
,或TypedArray
SetBackgroundDrawable()
。如果没有图像资源,这些方法中的任何一种都可以工作,但在添加图像资源时,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>
答案 0 :(得分:1)
单击时,这些按钮没有所需的按钮单击/连锁效果。
单击ImageButton
时,它确实有一个按钮点击/涟漪效果,但图像覆盖了它。
您可以自定义ImageButton
来处理触摸事件,在收到点击事件时,您可以在图片上添加ColorFilter
以实现点击/连锁效果。
这是我的代码:
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();
};
效果: