如何在Android中调用CustomView的onDraw(Canvas canvas)函数?

Posted

技术标签:

【中文标题】如何在Android中调用CustomView的onDraw(Canvas canvas)函数?【英文标题】:How to call onDraw(Canvas canvas) function of CustomView in Android? 【发布时间】:2020-03-07 05:07:22 【问题描述】:

我生成一个椭圆,并尝试根据您可以在下面看到的 sweepAngle_speed 重塑形状。这个 sweepAngle_speed 来自 MainActivity.java。在 MainActivity.java 中,我创建了一个 seekbar,并在 seekbar 的值和 sweepAngle_speed 之间使用算法,因此我预计椭圆中的填充区域会发生变化。 onDraw 函数不是直接调用的,所以我在我创建的 getLog 函数中使用了 invalidate 函数。但是我无论如何都不能调用 onDraw 函数。当我运行代码时,onDraw 函数被系统直接调用了 3 次,但是当我更改 seekbar 值时,我无论如何都不调用 onDraw 函数。我的第一个问题是系统如何直接调用 onDraw 函数?第二个是我如何在系统工作期间调用 onDraw 函数。谢谢。

CustomView.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();

【问题讨论】:

你有重绘功能吗? 其实我改变了sweepAngle_speed。它是在代码顶部定义的,我没有放在这里。同样在日志 Log.d(TAG, "CANVAS: onDraw içine girdi ve Speed angle: " + sweepAngle_speed);我可以看到变化。但是这个变化不会影响角度,我的意思是我不能调用 onDraw 函数 我使用了无效而不是重绘功能,但它不起作用 【参考方案1】:

您不能直接调用 onDraw。您可以使用将重绘它的 invalidate 方法

您可以在 CustomView 类中创建一个函数,例如:

public void setSpeed(int sweepAngle_speed)
    this. sweepAngle_speed = sweepAngle_speed;
    invalidate();  // This invalidate will call onDraw and draw your view again

【讨论】:

我试了一下,还是无法进入onDraw函数,视图也没有再次绘制。 在setSpeed中,我创建了Canvas cnvs = new Canvas();和onDraw(cnvs),我进入了onDraw函数。 onDraw 函数得到正确的 sweepAngle_speed,但它仍然不能绘制新的椭圆。为什么? 您不必创建新的 Canvas 并调用 onDraw 函数。 invalidate() 将调用您的 onDraw 函数,该函数已经在参数中提供了画布。【参考方案2】:

如果你扩展ViewGroup,那么你需要在ViewGroup的构造函数中调用setWillNotDraw(false)

【讨论】:

以上是关于如何在Android中调用CustomView的onDraw(Canvas canvas)函数?的主要内容,如果未能解决你的问题,请参考以下文章

在 addSubview 中调用具有动态 ScrollView ContentSize Autolayout 的 CustomView

带有 xml 的 CustomView 不显示在屏幕上

在 UIBarButtonItem 的 customView 字段中更新 UIView

Android 从 CustomView 绘制 TextView

在 customView 中的 ImageView 上叠加许多图像视图

无法解决:customview-1.1.0