Я разрабатываю приложение для совместной работы, в котором пользователи могут рисовать на холсте вместе, образуя расстояние, используя базу данных FireBase в реальном времени. Я дошел до того, что сегмент, нарисованный на одном пользовательском экране, появляется на экране другого пользователя, и наоборот.
Однако, как только сегмент извлечен из базы, он вытолкнул aws сегмент на заднем плане вместо «краски» от пользователя.
Есть ли способ чтобы программа всегда рисовала различные сегменты друг над другом?
Оранжевая линия, нарисованная на правом телефоне, появляется на фоне левого телефона
Я поместил фрагменты кода, которые я здесь использую:
Здесь я извлекаю сегмент из FireBase:
mListener=mRef.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String previousChildName) {
String name=dataSnapshot.getKey();
if (!mOutstandingSegments.contains(name)) {
Segment segment = dataSnapshot.getValue(Segment.class);
drawSegmentPath(segment.getPoints(), segment.getColor(), segment.getBlurEnabled(), segment.getStrokeWidth());
//invalidate();
}
}
@Override
public void onChildChanged(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
}
@Override
public void onChildRemoved(@NonNull DataSnapshot dataSnapshot) {
}
}
@Override
public void onChildMoved(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}
Сегмент преобразуется в путь с помощью этого метода:
public void drawSegmentPath(List<Point> segmentPoints, int color, boolean blurEnabled, float strokeWidth){
Point currentSegmentPoint = segmentPoints.get(0);
Path newSegmentPath = new Path();
FingerPath fireBasePath = new FingerPath(color, blurEnabled, strokeWidth, newSegmentPath);
firePath.add(fireBasePath);
newSegmentPath.reset();
newSegmentPath.moveTo(currentSegmentPoint.x, currentSegmentPoint.y);
Point nextSegmentPoint = null;
invalidate();
for (int i = 1; i < segmentPoints.size(); i++) {
nextSegmentPoint = segmentPoints.get(i);
newSegmentPath.quadTo(currentSegmentPoint.x, currentSegmentPoint.y, (int)((nextSegmentPoint.x + currentSegmentPoint.x) / 2), (int)((nextSegmentPoint.y + currentSegmentPoint.y) / 2));
currentSegmentPoint = nextSegmentPoint;
System.out.println("Current Segment Points: " + currentSegmentPoint);
invalidate();
}
if (nextSegmentPoint != null) {
newSegmentPath.lineTo(nextSegmentPoint.x, nextSegmentPoint.y);
invalidate();
}
}
Затем в onDraw () путь рисуется на том же холсте (mCanvas), что и линии, которые пользователь dr aws на своем телефоне:
@Override
protected void onDraw(Canvas canvas){
canvas.save();
mCanvas.drawColor(Color.WHITE);
for(FingerPath fireBasePath : firePath){
mPaint.setColor(fireBasePath.myColor);
mPaint.setStrokeWidth(fireBasePath.strokeWidth);
mPaint.setMaskFilter(null);
if (fireBasePath.blurEnabled){testPaint.setMaskFilter(mBlur);}
mCanvas.drawPath(fireBasePath.path, mPaint);
}
for(FingerPath fp : paths){
mPaint.setColor(fp.myColor);
mPaint.setStrokeWidth(fp.strokeWidth);
mPaint.setMaskFilter(null);
if (fp.blurEnabled){mPaint.setMaskFilter(mBlur);}
mCanvas.drawPath(fp.path, mPaint);
}
canvas.drawBitmap(mBitmap, drawMatrix, mBitmapPaint);
canvas.concat(drawMatrix);
canvas.restore();
invalidate();
}
Сегмент находится в процессе производится, когда пользователь перемещает палец по экрану, постоянно добавляя точки в классе Сегмент:
pivate void touchStart(float positionX, float positionY){
mPath = new Path();
FingerPath fp = new FingerPath(currentBrushColor, blurEnabled, strokeWidth, mPath);
mCurrentSegment = new Segment(currentBrushColor, strokeWidth, blurEnabled);
paths.add(fp);
mPath.reset();
mPath.moveTo(positionX, positionY);
mX = positionX;
mY = positionY;
mCurrentSegment.addPoint((int)mX, (int)mY);
}
private void touchMove(float positionX, float positionY){
float dx = Math.abs(positionX - mX);
float dy = Math.abs(positionY - mY);
if (dx >= TOUCH_TOLERANCE || dy >= TOUCH_TOLERANCE){
mPath.quadTo(mX, mY, (positionX + mX)/2, (positionY + mY)/2);
mX = positionX;
mY = positionY;
mCurrentSegment.addPoint((int)mX, (int)mY);
}
}
Затем, когда пользователь заканчивает рисование, сегмент помещается в FireBase:
private void touchUp(){
mPath.lineTo(mX,mY);
DatabaseReference segmentRef=mRef.push();
final String segmentName=segmentRef.getKey();
currentSegmentKey=segmentName;
mOutstandingSegments.add(segmentName);
Segment mySegment = new Segment(mCurrentSegment.getColor(), mCurrentSegment.getStrokeWidth(), blurEnabled);
for (Point point: mCurrentSegment.getPoints()) {
mySegment.addPoint(point.x , point.y );
}
System.out.println("Segment is: " + mySegment);
// Save our segment into Firebase.
segmentRef.setValue(mySegment, new DatabaseReference.CompletionListener() {
@Override
public void onComplete(DatabaseError error, DatabaseReference firebaseRef) {
if (error != null) {
throw error.toException();
}
mOutstandingSegments.remove(segmentName);
}
});
}
Различные методы onTouch вызываются в следующем o nTouchEvent lstener:
@Override
public boolean onTouchEvent(MotionEvent event){
float positionX = event.getX()
float positionY = event.getY()
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
touchStart(positionX, positionY);
invalidate();
break;
case MotionEvent.ACTION_MOVE:
touchMove(positionX, positionY);
invalidate();
break;
case MotionEvent.ACTION_UP:
touchUp();
invalidate();
break;
}
}
return true;
}