onDraw () не вызывается при перемещении холста к границам отображения - PullRequest
1 голос
/ 07 февраля 2020

У меня проблема с вызовом метода onDraw (). Я попытался найти здесь некоторые решения, но ничего не помогло.

Во-первых, у меня есть приложение для рисования и для перемещения с фигурами и фоном на холсте я использую View.onTouchListener (). Для перерисовки холста существует метод invalidate (). Для API 28 все в порядке. Работает правильно. Но для API 24 и ниже перерисовка останавливается, когда я достигаю границ отображения.

Вот пример видео: https://youtu.be/Nc3SLFff2Gg

В MotionEvent ACTION_MOVE называется Метод draw (), но только для API 24 и ниже. Казалось, работает лучше, но не слишком. Пример в видео. Без этого onDraw () не работает, когда я достигаю границ отображения, а затем никогда не вызывается снова.

Есть метод onDraw ():

 @Override
protected void onDraw(Canvas canvas) {
    canvas.save();
    mCanvas.drawColor(mBackgroundColor);
    if (mBitmapBackground.getBitmap() != null) {
        //zvetsovani a zmensovani vlozene fotky na pozadi
        mCanvas.setMatrix(mMatrix);

        //cele kouzlo, aby se nedeformovalo pozadi
        mCanvas.drawBitmap(mBitmapBackground.getBitmap(), mBitmapBackground.getLeft(), mBitmapBackground.getTop(), mPaint);
    }

    for (SMFBaseShape shape : mShapes) {
        if (shape.isEraser()) {
            shape.setMatrix(mMatrix);
            shape.drawOnCanvas();
        }
    }

    for (SMFBaseShape shape : mShapes) {
        if (!shape.isEraser()) {
            shape.setMatrix(mMatrix);
            shape.drawOnCanvas();
        }
    }

    setCanvasBounds(canvas);
    canvas.drawBitmap(mBitmap, 0, 0, mBitmapPaint);
    canvas.restore();
}

Вот лог:

2020-02-07 07:16:39.508 19966-19966/cz.kctdata.mpaint.innogy D/ViewRootImpl@b2860ba[SMFMainActivity]: ViewPostImeInputStage processPointer 0
2020-02-07 07:16:39.509 19966-19966/cz.kctdata.mpaint.innogy D/cz.kctdata.mpaint.innogy.listeners.SMFBaseTouchListener: mMode=DRAG
2020-02-07 07:16:39.509 19966-19966/cz.kctdata.mpaint.innogy I/cz.kctdata.mpaint.innogy.listeners.SMFShapeInteractListener: Build Version SDK: 24
2020-02-07 07:16:39.656 19966-19977/cz.kctdata.mpaint.innogy W/art: Suspending all threads took: 9.268ms
2020-02-07 07:16:39.663 19966-19977/cz.kctdata.mpaint.innogy I/art: Background sticky concurrent mark sweep GC freed 37(1608B) AllocSpace objects, 0(0B) LOS objects, 0% free, 52MB/52MB, paused 10.348ms total 40.218ms
2020-02-07 07:16:40.817 19966-19966/cz.kctdata.mpaint.innogy D/ViewRootImpl@b2860ba[SMFMainActivity]: ViewPostImeInputStage processPointer 1
2020-02-07 07:16:40.818 19966-19966/cz.kctdata.mpaint.innogy D/cz.kctdata.mpaint.innogy.listeners.SMFBaseTouchListener: mMode=NONE
2020-02-07 07:16:41.183 19966-19966/cz.kctdata.mpaint.innogy D/ViewRootImpl@b2860ba[SMFMainActivity]: ViewPostImeInputStage processPointer 0
2020-02-07 07:16:41.184 19966-19966/cz.kctdata.mpaint.innogy D/cz.kctdata.mpaint.innogy.listeners.SMFBaseTouchListener: mMode=DRAG
2020-02-07 07:16:41.184 19966-19966/cz.kctdata.mpaint.innogy I/cz.kctdata.mpaint.innogy.listeners.SMFShapeInteractListener: Build Version SDK: 24
2020-02-07 07:16:41.330 19966-19977/cz.kctdata.mpaint.innogy W/art: Suspending all threads took: 7.160ms
2020-02-07 07:16:41.337 19966-19977/cz.kctdata.mpaint.innogy I/art: Background sticky concurrent mark sweep GC freed 35(1568B) AllocSpace objects, 0(0B) LOS objects, 0% free, 43MB/43MB, paused 11.693ms total 31.519ms
2020-02-07 07:16:41.503 19966-19977/cz.kctdata.mpaint.innogy W/art: Suspending all threads took: 5.428ms
2020-02-07 07:16:41.510 19966-19977/cz.kctdata.mpaint.innogy I/art: Background partial concurrent mark sweep GC freed 124(4KB) AllocSpace objects, 3(25MB) LOS objects, 37% free, 26MB/42MB, paused 11.120ms total 46.491ms
2020-02-07 07:16:41.615 19966-19977/cz.kctdata.mpaint.innogy W/art: Suspending all threads took: 5.913ms
2020-02-07 07:16:41.618 19966-19977/cz.kctdata.mpaint.innogy I/art: Background partial concurrent mark sweep GC freed 87(3KB) AllocSpace objects, 2(16MB) LOS objects, 37% free, 26MB/42MB, paused 6.992ms total 37.200ms
2020-02-07 07:16:42.342 19966-19977/cz.kctdata.mpaint.innogy W/art: Suspending all threads took: 5.979ms
2020-02-07 07:16:42.345 19966-19977/cz.kctdata.mpaint.innogy I/art: Background sticky concurrent mark sweep GC freed 24(776B) AllocSpace objects, 0(0B) LOS objects, 0% free, 53MB/53MB, paused 7.220ms total 13.834ms
2020-02-07 07:16:42.427 19966-19977/cz.kctdata.mpaint.innogy I/art: Background sticky concurrent mark sweep GC freed 19(632B) AllocSpace objects, 0(0B) LOS objects, 0% free, 53MB/53MB, paused 5.091ms total 11.886ms
2020-02-07 07:16:42.464 19966-19977/cz.kctdata.mpaint.innogy W/art: Suspending all threads took: 10.545ms
2020-02-07 07:16:42.467 19966-19977/cz.kctdata.mpaint.innogy I/art: Background partial concurrent mark sweep GC freed 125(4KB) AllocSpace objects, 3(26MB) LOS objects, 30% free, 35MB/51MB, paused 11.655ms total 39.680ms
2020-02-07 07:16:42.521 19966-19966/cz.kctdata.mpaint.innogy D/ViewRootImpl@b2860ba[SMFMainActivity]: ViewPostImeInputStage processPointer 1
2020-02-07 07:16:42.523 19966-19966/cz.kctdata.mpaint.innogy D/cz.kctdata.mpaint.innogy.listeners.SMFBaseTouchListener: mMode=NONE
2020-02-07 07:16:42.829 19966-19966/cz.kctdata.mpaint.innogy D/ViewRootImpl@b2860ba[SMFMainActivity]: ViewPostImeInputStage processPointer 0
2020-02-07 07:16:42.829 19966-19966/cz.kctdata.mpaint.innogy D/cz.kctdata.mpaint.innogy.listeners.SMFBaseTouchListener: mMode=DRAG
2020-02-07 07:16:42.829 19966-19966/cz.kctdata.mpaint.innogy I/cz.kctdata.mpaint.innogy.listeners.SMFShapeInteractListener: Build Version SDK: 24
2020-02-07 07:16:43.764 19966-19966/cz.kctdata.mpaint.innogy D/ViewRootImpl@b2860ba[SMFMainActivity]: ViewPostImeInputStage processPointer 1
2020-02-07 07:16:43.765 19966-19966/cz.kctdata.mpaint.innogy D/cz.kctdata.mpaint.innogy.listeners.SMFBaseTouchListener: mMode=NONE
2020-02-07 07:16:44.421 19966-19966/cz.kctdata.mpaint.innogy D/ViewRootImpl@b2860ba[SMFMainActivity]: ViewPostImeInputStage processPointer 0
2020-02-07 07:16:44.421 19966-19966/cz.kctdata.mpaint.innogy D/cz.kctdata.mpaint.innogy.listeners.SMFBaseTouchListener: mMode=DRAG
2020-02-07 07:16:44.421 19966-19966/cz.kctdata.mpaint.innogy I/cz.kctdata.mpaint.innogy.listeners.SMFShapeInteractListener: Build Version SDK: 24
2020-02-07 07:16:44.885 19966-19977/cz.kctdata.mpaint.innogy W/art: Suspending all threads took: 5.606ms
2020-02-07 07:16:44.890 19966-19977/cz.kctdata.mpaint.innogy I/art: Background sticky concurrent mark sweep GC freed 24(776B) AllocSpace objects, 0(0B) LOS objects, 0% free, 70MB/70MB, paused 6.978ms total 13.931ms
2020-02-07 07:16:45.094 19966-19966/cz.kctdata.mpaint.innogy D/ViewRootImpl@b2860ba[SMFMainActivity]: ViewPostImeInputStage processPointer 1
2020-02-07 07:16:45.095 19966-19966/cz.kctdata.mpaint.innogy D/cz.kctdata.mpaint.innogy.listeners.SMFBaseTouchListener: mMode=NONE
2020-02-07 07:16:45.506 19966-19966/cz.kctdata.mpaint.innogy D/ViewRootImpl@b2860ba[SMFMainActivity]: ViewPostImeInputStage processPointer 0
2020-02-07 07:16:45.506 19966-19966/cz.kctdata.mpaint.innogy D/cz.kctdata.mpaint.innogy.listeners.SMFBaseTouchListener: mMode=DRAG
2020-02-07 07:16:45.506 19966-19966/cz.kctdata.mpaint.innogy I/cz.kctdata.mpaint.innogy.listeners.SMFShapeInteractListener: Build Version SDK: 24
2020-02-07 07:16:45.747 19966-19977/cz.kctdata.mpaint.innogy I/art: Background partial concurrent mark sweep GC freed 157(5KB) AllocSpace objects, 5(43MB) LOS objects, 23% free, 53MB/69MB, paused 5.407ms total 39.418ms
2020-02-07 07:16:46.108 19966-19977/cz.kctdata.mpaint.innogy W/art: Suspending all threads took: 6.487ms
2020-02-07 07:16:46.111 19966-19977/cz.kctdata.mpaint.innogy I/art: Background partial concurrent mark sweep GC freed 143(4KB) AllocSpace objects, 3(26MB) LOS objects, 26% free, 44MB/60MB, paused 7.583ms total 42.841ms
2020-02-07 07:16:46.261 19966-19966/cz.kctdata.mpaint.innogy D/ViewRootImpl@b2860ba[SMFMainActivity]: ViewPostImeInputStage processPointer 1
2020-02-07 07:16:46.261 19966-19966/cz.kctdata.mpaint.innogy D/cz.kctdata.mpaint.innogy.listeners.SMFBaseTouchListener: mMode=NONE
2020-02-07 07:16:46.613 19966-19966/cz.kctdata.mpaint.innogy D/ViewRootImpl@b2860ba[SMFMainActivity]: ViewPostImeInputStage processPointer 0
2020-02-07 07:16:46.614 19966-19966/cz.kctdata.mpaint.innogy D/cz.kctdata.mpaint.innogy.listeners.SMFBaseTouchListener: mMode=DRAG
2020-02-07 07:16:46.614 19966-19966/cz.kctdata.mpaint.innogy I/cz.kctdata.mpaint.innogy.listeners.SMFShapeInteractListener: Build Version SDK: 24
2020-02-07 07:16:47.250 19966-19977/cz.kctdata.mpaint.innogy W/art: Suspending all threads took: 7.470ms
2020-02-07 07:16:47.252 19966-19977/cz.kctdata.mpaint.innogy I/art: Background sticky concurrent mark sweep GC freed 24(776B) AllocSpace objects, 0(0B) LOS objects, 0% free, 53MB/53MB, paused 8.739ms total 17.598ms
2020-02-07 07:16:47.448 19966-19966/cz.kctdata.mpaint.innogy D/ViewRootImpl@b2860ba[SMFMainActivity]: ViewPostImeInputStage processPointer 1
2020-02-07 07:16:47.449 19966-19966/cz.kctdata.mpaint.innogy D/cz.kctdata.mpaint.innogy.listeners.SMFBaseTouchListener: mMode=NONE
2020-02-07 07:16:47.759 19966-19966/cz.kctdata.mpaint.innogy D/ViewRootImpl@b2860ba[SMFMainActivity]: ViewPostImeInputStage processPointer 0
2020-02-07 07:16:47.759 19966-19966/cz.kctdata.mpaint.innogy D/cz.kctdata.mpaint.innogy.listeners.SMFBaseTouchListener: mMode=DRAG
2020-02-07 07:16:47.760 19966-19966/cz.kctdata.mpaint.innogy I/cz.kctdata.mpaint.innogy.listeners.SMFShapeInteractListener: Build Version SDK: 24
2020-02-07 07:16:48.015 19966-19977/cz.kctdata.mpaint.innogy I/art: Background sticky concurrent mark sweep GC freed 28(1000B) AllocSpace objects, 0(0B) LOS objects, 0% free, 61MB/61MB, paused 6.823ms total 17.334ms
2020-02-07 07:16:48.181 19966-19977/cz.kctdata.mpaint.innogy W/art: Suspending all threads took: 9.486ms
2020-02-07 07:16:48.184 19966-19977/cz.kctdata.mpaint.innogy I/art: Background partial concurrent mark sweep GC freed 142(5KB) AllocSpace objects, 3(25MB) LOS objects, 30% free, 35MB/51MB, paused 10.515ms total 52.516ms
2020-02-07 07:16:48.340 19966-19977/cz.kctdata.mpaint.innogy W/art: Suspending all threads took: 10.629ms
2020-02-07 07:16:48.345 19966-19977/cz.kctdata.mpaint.innogy I/art: Background partial concurrent mark sweep GC freed 130(4KB) AllocSpace objects, 3(25MB) LOS objects, 31% free, 35MB/51MB, paused 11.778ms total 56.589ms
2020-02-07 07:16:48.688 19966-19977/cz.kctdata.mpaint.innogy W/art: Suspending all threads took: 11.928ms
2020-02-07 07:16:48.691 19966-19977/cz.kctdata.mpaint.innogy I/art: Background partial concurrent mark sweep GC freed 90(3KB) AllocSpace objects, 2(16MB) LOS objects, 37% free, 26MB/42MB, paused 13.499ms total 42.253ms
2020-02-07 07:16:48.706 19966-19966/cz.kctdata.mpaint.innogy D/ViewRootImpl@b2860ba[SMFMainActivity]: ViewPostImeInputStage processPointer 1
2020-02-07 07:16:48.707 19966-19966/cz.kctdata.mpaint.innogy D/cz.kctdata.mpaint.innogy.listeners.SMFBaseTouchListener: mMode=NONE
2020-02-07 07:16:49.060 19966-19966/cz.kctdata.mpaint.innogy D/ViewRootImpl@b2860ba[SMFMainActivity]: ViewPostImeInputStage processPointer 0
2020-02-07 07:16:49.060 19966-19966/cz.kctdata.mpaint.innogy D/cz.kctdata.mpaint.innogy.listeners.SMFBaseTouchListener: mMode=DRAG
2020-02-07 07:16:49.060 19966-19966/cz.kctdata.mpaint.innogy I/cz.kctdata.mpaint.innogy.listeners.SMFShapeInteractListener: Build Version SDK: 24
2020-02-07 07:16:49.307 19966-19977/cz.kctdata.mpaint.innogy I/art: Background partial concurrent mark sweep GC freed 125(4KB) AllocSpace objects, 3(25MB) LOS objects, 37% free, 26MB/42MB, paused 5.568ms total 39.592ms
2020-02-07 07:16:49.420 19966-19977/cz.kctdata.mpaint.innogy W/art: Suspending all threads took: 15.885ms
2020-02-07 07:16:49.423 19966-19977/cz.kctdata.mpaint.innogy I/art: Background partial concurrent mark sweep GC freed 86(3056B) AllocSpace objects, 2(16MB) LOS objects, 37% free, 26MB/42MB, paused 16.908ms total 48.915ms
2020-02-07 07:16:49.614 19966-19977/cz.kctdata.mpaint.innogy W/art: Suspending all threads took: 6.277ms
2020-02-07 07:16:49.618 19966-19977/cz.kctdata.mpaint.innogy I/art: Background partial concurrent mark sweep GC freed 83(2952B) AllocSpace objects, 2(16MB) LOS objects, 37% free, 26MB/42MB, paused 7.650ms total 33.178ms
2020-02-07 07:16:49.844 19966-19977/cz.kctdata.mpaint.innogy W/art: Suspending all threads took: 21.130ms
2020-02-07 07:16:49.847 19966-19977/cz.kctdata.mpaint.innogy I/art: Background partial concurrent mark sweep GC freed 68(2392B) AllocSpace objects, 2(16MB) LOS objects, 37% free, 26MB/42MB, paused 22.507ms total 48.887ms
2020-02-07 07:16:49.890 19966-19966/cz.kctdata.mpaint.innogy D/ViewRootImpl@b2860ba[SMFMainActivity]: ViewPostImeInputStage processPointer 1
2020-02-07 07:16:49.890 19966-19966/cz.kctdata.mpaint.innogy D/cz.kctdata.mpaint.innogy.listeners.SMFBaseTouchListener: mMode=NONE

Схема деятельности:

<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout 
   xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:app="http://schemas.android.com/apk/res-auto"
   xmlns:tools="http://schemas.android.com/tools"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   tools:context="cz.kctdata.mpaint.innogy.activity.SMFMainActivity">

<cz.kctdata.mpaint.innogy.drawtool.SMFPaintView
    android:id="@+id/pvActivityMain_paintView"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerInParent="true"
    android:longClickable="true"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintTop_toTopOf="parent"
    tools:layout_height="100dp"
    tools:layout_width="100dp" />

<cz.kctdata.mpaint.innogy.widget.SMFShapeSettingsWidget
    android:id="@+id/sSActivityMain_shapeSettings"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:visibility="invisible" />
</androidx.coordinatorlayout.widget.CoordinatorLayout>

Спасибо за ваши предложения:)

Ответы [ 2 ]

1 голос
/ 07 февраля 2020

Если вы выполняете все рисование в функции onDraw одного представления, возможно, ОС перестает отображать представление, как только оно покидает экран, и поэтому функция onDraw этого представления больше не вызывается.

0 голосов
/ 10 февраля 2020

Может быть, у меня есть решение. Я добавил метод invalidateOutline (), и кажется, что перерисовка наконец работает.

Но что именно делает метод? Могу ли я использовать его, вызывая его, когда я двигаюсь пальцем по экрану?

Спасибо ?

...