Android (Xamarin) selectableItemBackground - SetBackgroundResource 不能与 SetImageResource 一起使用
Android (Xamarin) selectableItemBackground - SetBackgroundResource not working with SetImageResource
我正在使用创建图像按钮并将它们显示在 activity 上的自定义网格适配器,使用方法 SetImageResource()
设置按钮的源图像。
但是,当点击这些按钮时,这些按钮没有预期的按钮效果 click/ripple。环顾四周后,我找到了几个解决方案,利用 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>
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();
};
效果:
我正在使用创建图像按钮并将它们显示在 activity 上的自定义网格适配器,使用方法 SetImageResource()
设置按钮的源图像。
但是,当点击这些按钮时,这些按钮没有预期的按钮效果 click/ripple。环顾四周后,我找到了几个解决方案,利用 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>
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();
};
效果: