Как сохранить пути на холсте в базу данных и заново их перерисовать - PullRequest
0 голосов
/ 01 августа 2020

Я создаю приложение Pictionary.

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

Чертежная часть выполнена полностью успешно. Но я не могу перерисовать эти пути на другом устройстве, хотя я получаю пути правильно.

Вот мой вид, где происходит весь рисунок:

class DoodleCanvas(context: Context?, attrs: AttributeSet?) :
    View(context, attrs) {
    private var mPaint: Paint = Paint()
    private var lastPaintStroke: Paint = Paint()
    private var mPath: SerializablePath
    private var pathList: ArrayList<PathPojo> = ArrayList()
    private var backupPathList: ArrayList<PathPojo> = ArrayList()
    private var db = FirebaseFirestore.getInstance();
    override fun onDraw(canvas: Canvas) {
        super.onDraw(canvas)
        for (path in pathList) {
            val pathToDraw = path.path;
            mPaint.color = path.color
            mPaint.strokeWidth = path.strokeWidth
            canvas.drawPath(pathToDraw, mPaint)

        }

    }

    override fun onTouchEvent(event: MotionEvent): Boolean {
        when (event.action) {
            MotionEvent.ACTION_DOWN -> {
                mPath = SerializablePath();
                mPath.moveTo(event.x, event.y)
                pathList.add(
                    PathPojo(
                        mPath,
                        mPaint.color,
                        mPaint.strokeWidth
                    )
                )
                makeFirestoreChanges(pathList);
            }
            MotionEvent.ACTION_MOVE -> {

                mPath.lineTo(event.x, event.y)

                invalidate()
            }
            MotionEvent.ACTION_UP -> {
            }
        }
        return true
    }

    init {
        mPaint.color = Color.RED
        mPaint.style = Paint.Style.STROKE
        mPaint.strokeJoin = Paint.Join.ROUND
        mPaint.strokeCap = Paint.Cap.ROUND
        mPaint.strokeWidth = 10f
        mPath = SerializablePath()
//        listenToFirebaseChanges();
    }

    fun setStrokeColor(color: Int) {
        mPaint.color = color;
    }

    fun setStrokeWidth(strokeWidth: Float) {
        mPaint.strokeWidth = strokeWidth;
    }

    fun undoMove() {
        if (pathList.size > 0) {
            pathList.removeAt(pathList.size - 1);
        } else {
            pathList.addAll(backupPathList);

        }
        makeFirestoreChanges(pathList);
        invalidate();
    }

    private fun storeLastPaintStroke(lastPaint: Paint) {
        lastPaintStroke = lastPaint;
    }

    fun clearCanvas() {
        backupPathList.clear()
        backupPathList.addAll(pathList)
        pathList.clear();
        makeFirestoreChanges(pathList);
        invalidate();
    }

    fun makeFirestoreChanges(pathList: ArrayList<PathPojo>) {
        val game: HashMap<String, Any> = HashMap()
        game["paths"] = pathList;
        db.collection("Pictionary")
            .document("games")
            .collection("game2")
            .document("paths").set(game)
    }

    private fun listenToFirebaseChanges() {
        db.collection("Pictionary")
            .document("games")
            .collection("game2")
            .document("paths").addSnapshotListener { snapshot, e ->
                if (e != null) {
                    Log.w("SnapShot", "Listen failed.", e)
                    return@addSnapshotListener
                }

                if (snapshot != null && snapshot.exists()) {
                    var newPathList: ArrayList<PathPojo>;

                    val gson = Gson();
                    val jsonString: String = gson.toJson(snapshot["paths"]);
                    Log.d("SnapShot", "Current data: $jsonString");
                    val typeMyType: Type = object :
                        TypeToken<ArrayList<PathPojo>>() {}.type
                    newPathList = gson.fromJson(jsonString, typeMyType);
                    Log.d("SnapShot", "Current data: $newPathList");
                    updateCanvas(newPathList)

                } else {
                    Log.d("SnapShot", "Current data: null")
                }
            }
    }

    fun updateCanvas(newPathList: ArrayList<PathPojo>) {
        this.pathList.clear();
        this.pathList.addAll(newPathList);
        invalidate();
    }
}

Теперь как только я раскомментирую метод listenToFirebaseChanges(), я вижу, что на холсте ничего не рисуется, хотя я знаю, что получаю пути из Firestore (проверено с помощью журналов).

Вот PathPojo класс:

class PathPojo : Serializable, Parcelable {
    @Expose
    @SerializedName("docType")
    var path: SerializablePath;

    @Expose
    @SerializedName("docName")
    var color: Int;

    @Expose
    @SerializedName("docTitle")
    var strokeWidth: Float;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...