如何制作带有点的自定义文本视图?
how do I make a custom textview that has dots?
我正在尝试制作一个日历,我想向用户显示有关特定日期存储的事件的某种信息。我正在考虑使用带有他们为活动选择的颜色的小点,但我似乎无法找到一种方法来做到这一点,如果可能的话......
我有这个:
我想要这样的东西:
有人可以帮助我,或者给我一些建议吗?
您可以尝试使用第三方库 material-calendarview to implement this feature, it provide a DayViewDecorators class 来自定义个别日期:
- 设置自定义背景
- 设置自定义选择器
- 将跨度应用于全天的文本
- 我们提供
DotSpan
将在文本下方居中绘制一个点
- 将日期设置为禁用
由于您正在使用 Xamarin.Android
,因此您可以通过 Binding a Java Library.
在您的 Xamarin.Android
项目中使用此 java 库
顺便说一下,有人为您完成了这项工作:https://github.com/NAXAM/materialcalendarview-xamarin-android-binding, you could directly install it in nuget package。
用法简单
在XAML
中使用:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.prolificinteractive.materialcalendarview.MaterialCalendarView
android:id="@+id/calendar_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="16dp"
android:layout_marginRight="16dp"
android:background="@drawable/bg_custom_date_picker"
app:mcv_selectionColor="@color/colorAccent"
app:mcv_showOtherDates="other_months"
android:layout_marginBottom="16dp"/>
</LinearLayout>
在您的代码中:
public class CalendarActivity : AppCompatActivity
{
protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
SetContentView(Resource.Layout.activity_calendar);
MaterialCalendarView calendar = FindViewById<MaterialCalendarView>(Resource.Id.calendar_view);
calendar.SetSelectedDate(Java.Util.Calendar.GetInstance(Java.Util.Locale.English));
List<CalendarDay> dates = new List<CalendarDay>();
CalendarDay a = CalendarDay.From(2018, 11, 10);
CalendarDay b = CalendarDay.From(2018, 11, 15);
CalendarDay c = CalendarDay.From(2018, 11, 9);
CalendarDay d = CalendarDay.From(2018, 11, 1);
dates.Add(a);
dates.Add(b);
dates.Add(c);
dates.Add(d);
calendar.AddDecorators(new EventDecorator(this, Color.Red, dates));
}
class EventDecorator : Java.Lang.Object, IDayViewDecorator
{
private int color;
private List<CalendarDay> dates;
public EventDecorator(CalendarActivity calendarActivity, int color, List<CalendarDay> dates)
{
this.color = color;
this.dates = dates;
}
public void Decorate(DayViewFacade view)
{
view.AddSpan(new DotSpan(15, color));
}
public bool ShouldDecorate(CalendarDay day)
{
//return dates.Contains(day);
//Has issue when using the above code:
if (dates[0].ToString() == day.ToString() || dates[1].ToString() == day.ToString() || dates[2].ToString() == day.ToString() || dates[3].ToString() == day.ToString())
{
return true;
}
else
{
return false;
}
}
}
}
Effect.
我正在尝试制作一个日历,我想向用户显示有关特定日期存储的事件的某种信息。我正在考虑使用带有他们为活动选择的颜色的小点,但我似乎无法找到一种方法来做到这一点,如果可能的话......
我有这个:
有人可以帮助我,或者给我一些建议吗?
您可以尝试使用第三方库 material-calendarview to implement this feature, it provide a DayViewDecorators class 来自定义个别日期:
- 设置自定义背景
- 设置自定义选择器
- 将跨度应用于全天的文本
- 我们提供
DotSpan
将在文本下方居中绘制一个点
- 我们提供
- 将日期设置为禁用
由于您正在使用 Xamarin.Android
,因此您可以通过 Binding a Java Library.
Xamarin.Android
项目中使用此 java 库
顺便说一下,有人为您完成了这项工作:https://github.com/NAXAM/materialcalendarview-xamarin-android-binding, you could directly install it in nuget package。
用法简单
在XAML
中使用:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.prolificinteractive.materialcalendarview.MaterialCalendarView
android:id="@+id/calendar_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="16dp"
android:layout_marginRight="16dp"
android:background="@drawable/bg_custom_date_picker"
app:mcv_selectionColor="@color/colorAccent"
app:mcv_showOtherDates="other_months"
android:layout_marginBottom="16dp"/>
</LinearLayout>
在您的代码中:
public class CalendarActivity : AppCompatActivity
{
protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
SetContentView(Resource.Layout.activity_calendar);
MaterialCalendarView calendar = FindViewById<MaterialCalendarView>(Resource.Id.calendar_view);
calendar.SetSelectedDate(Java.Util.Calendar.GetInstance(Java.Util.Locale.English));
List<CalendarDay> dates = new List<CalendarDay>();
CalendarDay a = CalendarDay.From(2018, 11, 10);
CalendarDay b = CalendarDay.From(2018, 11, 15);
CalendarDay c = CalendarDay.From(2018, 11, 9);
CalendarDay d = CalendarDay.From(2018, 11, 1);
dates.Add(a);
dates.Add(b);
dates.Add(c);
dates.Add(d);
calendar.AddDecorators(new EventDecorator(this, Color.Red, dates));
}
class EventDecorator : Java.Lang.Object, IDayViewDecorator
{
private int color;
private List<CalendarDay> dates;
public EventDecorator(CalendarActivity calendarActivity, int color, List<CalendarDay> dates)
{
this.color = color;
this.dates = dates;
}
public void Decorate(DayViewFacade view)
{
view.AddSpan(new DotSpan(15, color));
}
public bool ShouldDecorate(CalendarDay day)
{
//return dates.Contains(day);
//Has issue when using the above code:
if (dates[0].ToString() == day.ToString() || dates[1].ToString() == day.ToString() || dates[2].ToString() == day.ToString() || dates[3].ToString() == day.ToString())
{
return true;
}
else
{
return false;
}
}
}
}
Effect.