Я создаю приложение 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;
}