我正在尝试将彩色圆点添加到我的自定义Calendarview中。 可以使用颜色选择器选择颜色,但它会返回负颜色值,例如:" -126706"(红色)。
如果我使用colorpicker中的颜色,Calendarview需要一个int但崩溃。如果我使用" R.color.holo_red_dark"但后来我不能使用不同的颜色。如果我采用holo_red_dark的常量值(" 17170455"),它也有效。
是否可以将负的int颜色转换为holo_red_dark的常量值等格式?
#include <boost/interprocess/managed_shared_memory.hpp>
using namespace boost::interprocess;
int main() {
{ managed_shared_memory msm(open_or_create, "mmap", 400); }
{ managed_shared_memory::grow("mmap", 65535); }
{ managed_shared_memory msm(open_only, "mmap"); }
}
答案 0 :(得分:3)
那是因为colorpicker返回颜色的十六进制表示(采用AARRGGBB格式),而您调用的方法需要int
表示资源的ID。您应该从颜色选择器返回的值创建一个Color
实例,然后将此对象传递给颜色设置器。
例如,蓝色是-16776961(即0xff0000ff)。
在调查FlexibleCalendar库的源代码之后,我来到了这个方法(来自类com.p_v.flexiblecalendar.view.CircularEventCellView
):
@Override
public void setEvents(List<? extends Event> colorList){
if(colorList!=null){
paintList = new ArrayList<>(colorList.size());
for(Event e: colorList){
Paint eventPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
eventPaint.setStyle(Paint.Style.FILL);
eventPaint.setColor(getContext().getResources().getColor(e.getColor()));
paintList.add(eventPaint);
}
invalidate();
requestLayout();
}
}
正如您所看到的,int
值被解释为资源标识符(即它尝试从res
文件夹中获取颜色),而不是ARGB值。
要解决此问题,您需要创建CircularEventCellView
的子类,以便使用与此类似的方法覆盖setEvents
方法:
@Override
public void setEvents(List<? extends Event> colorList){
if(colorList!=null){
paintList = new ArrayList<>(colorList.size());
for(Event e: colorList){
Paint eventPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
eventPaint.setStyle(Paint.Style.FILL);
eventPaint.setColor(e.getColor()); // ONLY THIS LINE CHANGED
paintList.add(eventPaint);
}
invalidate();
requestLayout();
}
}
完成此修改后,如果您仍想使用资源标识符,则应通过以下代码手动检索其ARGB值:
int desiredColor = getContext().getResources().getColor(R.color.mycolor);
然后将其设置为事件。