Как вызвать функцию onDraw (Canvas Canvas) CustomView в Android?

Я генерирую эллипс и пытаюсь изменить его форму в соответствии с sweepAngle_speed, которое вы видите ниже. Этот sweepAngle_speed взят из MainActivity.java. В MainActivity.java я создаю панель поиска и использую алгоритм между значением панели поиска и sweepAngle_speed, поэтому я ожидал изменения заполненной области в моем эллипсе. Функция onDraw не вызывается напрямую, поэтому я использую функцию invalidate в своей функции getLog, созданной мной. Однако я все равно не могу вызвать функцию onDraw. Когда я запускаю код, функция onDraw вызывается системой напрямую 3 раза, однако, когда я меняю значение панели поиска, я все равно не вызываю функцию 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();
}

}

2 ответа

Вы не можете напрямую вызвать 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
}

Если вы продлите ViewGroup так что тебе нужно позвонить setWillNotDraw(false) в конструкторе вашего ViewGroup

Другие вопросы по тегам