Аннулировать метод, работающий только при включении onDraw

Я пытаюсь обновить отображение клепсидры, используя недействительность в одном из установщиков класса. Однако, похоже, это не называется. С другой стороны, если я поставлю недействительным в методе onDraw, он сработает. Есть ли что-то, чего мне не хватает в документации.

До сих пор я пробовал писать аннулировать по-разному:

  • это.недействительно()
  • аннулировать ()
    public void setFillRatio(double fillRatio) {
        if (this.fillRatio != fillRatio){
            this.fillRatio = fillRatio;
            this.invalidate();
            Log.i("je suis passée", fillRatio + "");
        }

    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        Paint p = new Paint();
        Paint p2 = new Paint();
        p.setColor(Color.GRAY);
        p2.setColor(Color.BLUE);
        Log.i("filll ratio on draw",canvas.getHeight() - (canvas.getHeight() * fillRatio) + "");
        canvas.drawRect(new Rect(0,0, canvas.getWidth(), canvas.getHeight()), p);
        canvas.drawRect(new Rect(0, (canvas.getHeight() - (int)(canvas.getHeight() * fillRatio)), canvas.getWidth(), canvas.getHeight()), p2);
    }

Как ни странно, он регистрирует то, что находится под недействительным методом в установить коэффициент заполнения (), но журнал из onDraw не вызывается.

Редактировать 1:

Если кто-то хочет протестировать проект, не стесняйтесь загружать его через URL-адрес Google Диска: URL-адрес проекта.

Удалить super.onDraw(холст);

Pankaj Kumar 07.04.2019 12:22

Это не меняется. onDraw вызывается только один раз.

Alexandre Maneta 07.04.2019 12:27
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
2
156
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Проблема: Из вашего кода в activity_count_down.xml у вас уже есть пользовательское представление с именем Clepsydra.

<com.example.countdown.Clepsydra
    android:id = "@+id/view_clepsydra"
    android:layout_width = "363dp"
    android:layout_height = "379dp"
    android:layout_marginStart = "8dp"
    android:layout_marginLeft = "8dp"
    android:layout_marginTop = "8dp"
    android:layout_marginEnd = "8dp"
    android:layout_marginRight = "8dp"
    android:layout_marginBottom = "8dp"
    app:layout_constraintBottom_toBottomOf = "parent"
    app:layout_constraintEnd_toEndOf = "parent"
    app:layout_constraintHorizontal_bias = "0.615"
    app:layout_constraintStart_toStartOf = "parent"
    app:layout_constraintTop_toBottomOf = "@+id/button4" />

Но в CountDownActivity.java вы объявляете новый экземпляр пользовательского класса представления.

c = new Clepsydra(this);

Потому что они совершенно разные, вот почему вы не видите onDraw.

Решение: Измените свой код, чтобы вместо этого ссылаться на настраиваемое представление в XML-файле макета.

CountDownActivity.java

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_count_down);

    // Comment-out this line.
    // c = new Clepsydra(this);

    // Add this line instead
    c = findViewById(R.id.view_clepsydra);

    h = new Handler();
    pi =  PendingIntent.getActivity(this, 1, new Intent(this, EndOfCountDownActivity.class), PendingIntent.FLAG_UPDATE_CURRENT);
    am = (AlarmManager) this.getSystemService(Context.ALARM_SERVICE);
    refreshRunnable = new Runnable() {
        @Override
        public void run() {
            if (isActive){
                long val = countdown - (SystemClock.elapsedRealtime() - startTime);
                TextView cd = findViewById(R.id.textView4);
                cd.setText(String.format("%02d:%02d:%02d",
                        TimeUnit.MILLISECONDS.toHours(val),
                        TimeUnit.MILLISECONDS.toMinutes(val) -
                                TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(val)),
                        TimeUnit.MILLISECONDS.toSeconds(val) -
                                TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(val))));
                c.setFillRatio((double)val/countdown);
                // Comment-out this line as well.
                // c.invalidate();
                h.postDelayed(refreshRunnable, 500);
            }
        }
    };
}

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