java - 当 Canvas 移动到显示边框时,不会调用 onDraw()

标签 java android canvas ondraw

我在调用 onDraw() 方法时遇到问题。我尝试在这里找到一些解决方案,但没有任何帮助。

首先,我有一个绘画应用程序,为了在 Canvas 上移动形状和背景,我使用 View.onTouchListener()。为了重绘 Canvas ,有一个名为 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

Activity 布局:

<?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>

感谢您的建议:)

最佳答案

如果您在一个 View 的 onDraw 函数中进行所有绘图,则一旦 View 离开屏幕,操作系统可能会停止渲染该 View ,这就是该 View 的 onDraw 函数不再被调用的原因。

关于java - 当 Canvas 移动到显示边框时,不会调用 onDraw(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60108539/

相关文章:

javascript - 来自数据属性的渐变颜色

javascript - 未捕获类型错误 : Failed to execute 'drawImage' on Vue. js

java - 正则表达式 括号内的括号

java - 随机整数 : Android

java - 根据验证结果设置不同的http状态码

android - 在 Activity 之外调用 Realm.close()

Java 数列循环

java - JDK 与 Android SDK (ASDK)?

android - Android 上的离线谷歌语音识别

javascript - 动态创建 Canvas 并设置宽度和高度时字体太小