Я пытаюсь сделать палитру цветов, которая позволяет пользователям выбирать цвет, просто используя сенсорный ввод. Мой оттенок дает оттенок цветному кругу, а оттенок насыщенности -
я белый из центра. SweepGradient не нуждается в радиусе, но радиальный градиент требует его. Однако я вызываю это во время создания, когда оно не может получить фактические значения ширины и высоты. Вместо этого он принимает указанные значения. Есть ли промежуточный шаг, где радиус может быть установлен при наличии этой информации? Или я должен попробовать другой подход?
private Paint mPaint;
private int[] mColors;
private int viewWidth = 120;
private int viewHeight = 120;
private int centerX = 60;
private int centerY = 60;
private int padding = 10;
public ColorWheelView(Context context) {
super(context);
onInitialize();
// TODO Auto-generated constructor stub
}
private void onInitialize()
{
mColors = new int[] {
0xFFFF0000, 0xFFFF00FF, 0xFF0000FF, 0xFF00FFFF, 0xFF00FF00,
0xFFFFFF00, 0xFFFF0000
};
Shader totalShade = new SweepGradient(0, 0, mColors, null);
Shader hueShade = new SweepGradient(0, 0, mColors, null);
Shader saturationShade = new RadialGradient(0, 0, (float)viewWidth-padding, 0xFFFFFFFF, 0x00FFFFFF, Shader.TileMode.CLAMP);
//Shader valueShade;
totalShade = new ComposeShader(hueShade, saturationShade, PorterDuff.Mode.SCREEN);
mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mPaint.setShader(totalShade);
mPaint.setStyle(Paint.Style.FILL);
}
protected void onSizeChanged(int xNew, int yNew, int xOld, int yOld)
{
super.onSizeChanged(xNew, yNew, xOld, yOld);
viewWidth = xNew;
viewHeight = yNew;
centerX = viewWidth / 2;
centerY = viewHeight / 2;
}
protected void onLayout(boolean changed, int left, int top, int right, int bottom)
{
super.onLayout(changed, left, top, right, bottom);
viewWidth = right - left;
viewHeight = bottom - top;
centerX = viewWidth / 2;
centerY = viewHeight / 2;
}
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
{
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
int measuredHeight = measureHeight(heightMeasureSpec);
int measuredWidth = measureWidth(widthMeasureSpec);
setMeasuredDimension(measuredWidth, measuredHeight);
}
Если это поможет понять, чего я добиваюсь, я пытаюсь сделать это представление доступным для использования на экранах разных размеров. Вот почему мне нужна информация с устройства.