从颜色选择器获取错误的颜色值

时间:2016-02-11 10:29:51

标签: java android colors calendar color-picker

我正在尝试将彩色圆点添加到我的自定义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");           } 
}

1 个答案:

答案 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);

然后将其设置为事件。