【问题标题】:how do I make a custom textview that has dots?如何制作带有点的自定义文本视图?
【发布时间】:2018-11-19 18:04:35
【问题描述】:

我正在尝试做一个日历,我想向用户展示一些关于特定日期存储的事件的信息。我正在考虑使用他们为活动选择的颜色的小点,但如果可能的话,我似乎无法找到一种方法来做到这一点...... 我有这个: 我想要这样的东西:

有人可以帮助我,或者给我一个提示吗?

【问题讨论】:

  • TextView 只是一个 textview 对吧?但是对于这些点,我想你需要一个透明的 Canva,这是 android 为屏幕上的自定义绘图和形状提供的工具。
  • 我不熟悉 Xamarin,但在原生 android 中你可以这样做:让 TextView 有一个底部 Drawable(使用 setCompoundDrawables...() 方法之一)。使用一些具有所需点数的白色 Drawable 并在将其设置为底部 drawable 之前应用滤色器(使用 setColorFilter() )。在设置过滤器之前,不要忘记在 Drawable 上调用 mutate()
  • @0X0nosugar 我可以用这种方法制作多个不同颜色的点吗?!
  • 例如,有一个红点、一个蓝点和一个绿点?
  • 是的,如果您构建一个每层一个点的可绘制层列表

标签: android xamarin.android drawing custom-view


【解决方案1】:

您可以尝试使用第三方库material-calendarview 来实现此功能,它提供了一个DayViewDecorators 类来自定义各个日期:

  • 设置自定义背景
  • 设置自定义选择器
  • 将跨度应用于一整天的文本
    • 我们提供DotSpan,它将在文本下方居中绘制一个点
  • 将日期设置为禁用

由于您使用的是Xamarin.Android,您可以通过Binding a Java Library 在您的Xamarin.Android 项目中使用这个java 库。

顺便说一句,别人为你做了这个工作:https://github.com/NAXAM/materialcalendarview-xamarin-android-binding,你可以直接安装在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: https://stackoverflow.com/questions/45193268/adding-decorations-using-materialcalendarview-binding-library-in-xamarin-android/45207338#45207338

            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.

【讨论】:

  • 嗯,它确实做了我想做的事,但是现在我没有足够的时间在我的项目中实现它,因为我只剩下几天了,当我再次回到它时(不知道什么时候)我一定会试一试的,谢谢!
猜你喜欢
  • 2016-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多