我从View
派生了一个类,并按如下方式实现了onDraw
方法:
protected void onDraw( Canvas canvas )
{
Paint p = new Paint();
p.setColor( Color.HSVToColor( new float[]{ 1.f, 1.f, 1.f } ) );
p.setStyle( Paint.Style.FILL );
canvas.drawRect( area, p );
}
我期待看到一个彩色的矩形,但是屏幕保持白色,没有我尝试用于色调,值和饱和度的值。变量area
是RectF
。这很好,因为如果我将颜色添加到Color.RED
,它就会起作用。
Android文档在Color.HSVToColor
上声明:
将HSV组件转换为ARGB颜色。 Alpha设置为0xFF。 hsv [0]是Hue [0 .. 360)hsv [1]是饱和度[0 ... 1] hsv [2]是值[0 ... 1]如果hsv值超出范围,它们被固定。
我尝试了很多色调/饱和度/值组合,但屏幕始终保持空白。此外,我尝试了以下结果,结果相同:
float[] hsv = new float[ 3 ];
Color.colorToHSV( Color.RED, hsv );
Paint p = new Paint();
p.setColor( Color.HSVToColor( hsv ) );
p.setStyle( Paint.Style.FILL );
canvas.drawRect( area, p );
我做错了什么?
答案 0 :(得分:4)
Color.HSVToColor调用本机辅助函数,因此它在Eclipse或Android Studio上无法在预览模式下工作。
以下是该功能的来源:
public static int HSVToColor(int alpha, float hsv[]) {
if (hsv.length < 3) {
throw new RuntimeException("3 components required for hsv");
}
return nativeHSVToColor(alpha, hsv);
}
查看 java.awt.Color 以获取Java代码,将RGB转换为HSV并返回。
答案 1 :(得分:3)
你的平局应该可以正常工作。必须有一些缺失的东西,或者除了抽签以外的其他东西,你做得不对。
mpaint.setColor( Color.HSVToColor( new float[]{ 1f, 1f, 1f } ) );
以上应将颜色设置为红色。
我已经完成了类似于你在onDraw()中所做的事情,除了我改变了值并且它有效。
public class FingerPaintActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
MyView mv= new MyView(this);
setContentView(mv);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
class MyView extends View
{
Context c;
private Paint mpaint;
public MyView(Context context) {
super(context);
c= context;
mpaint= new Paint();
//mpaint.setColor(Color.RED);
mpaint.setColor( Color.HSVToColor( new float[]{ 0f, 0f, 0.5f } ) );
mpaint.setStyle(Paint.Style.FILL);
}
@Override
protected void onDraw(Canvas canvas) {
canvas.drawRect(300, 100, 200, 300, mpaint);
}
}
}