我生成了一个椭圆,并尝试根据sweepAngle_speed重塑形状,u可以在下面看到。这个sweepAngle_speed来自MainActivity.java.在MainActivity.java中,我创建了一个seekbar,并使用了seekbar值和sweepAngl_speed之间的算法,因此我预计椭圆中的填充区域会发生变化。onDraw函数不是直接调用的,所以我在自己创建的getLog函数中使用了invalide函数。但是我无论如何都不能调用onDraw功能。当我运行代码时,onDraw函数被系统直接调用了3次,但当我更改搜索栏值时,我无论如何都不会调用onDraw功能。我的第一个问题是系统如何直接调用onDraw函数?第二个是如何在系统工作期间调用onDraw函数。谢谢
自定义视图.java
public CustomView(Context context, @Nullable AttributeSet attrs) {
super(context);
m_Context = context;
getLog();
// create the Paint and set its color
}``
@Override
protected void onDraw(Canvas canvas) {
//c=canvas;
//super.onDraw(c);
Paint p1 = new Paint();
RectF rectF = new RectF(-750, 0, 750, 720);
//p1.setColor(Color.parseColor("#34ebe2"));
p1.setShader(new LinearGradient(0, -360, 0, getHeight(), Color.CYAN, Color.BLUE, Shader.TileMode.MIRROR));
Log.d(TAG, "CANVAS: onDraw içine girdi ve Speed angle: " + sweepAngle_speed);
canvas.drawArc(rectF, 90, -sweepAngle_speed, true, p1);
}
public void getLog () {
paint = new Paint();
paint.setColor(Color.BLUE);
Log.d(TAG, "Speed geldi buraya ve invalidate yaptı");
setWillNotDraw(false);
//this.invalidate();
this.invalidate();
}
}
您不能直接调用onDraw。您可以使用无效方法,该方法将重新绘制
您可以在CustomView类中创建一个函数,例如:
public void setSpeed(int sweepAngle_speed){
this. sweepAngle_speed = sweepAngle_speed;
invalidate(); // This invalidate will call onDraw and draw your view again
}
如果扩展ViewGroup
,则需要在ViewGroup
的构造函数中调用setWillNotDraw(false)