diff --git a/app/src/main/java/org/ntlab/acanthus_client/views/paint/PaintActivity.java b/app/src/main/java/org/ntlab/acanthus_client/views/paint/PaintActivity.java index 6cab191..83065ac 100644 --- a/app/src/main/java/org/ntlab/acanthus_client/views/paint/PaintActivity.java +++ b/app/src/main/java/org/ntlab/acanthus_client/views/paint/PaintActivity.java @@ -6,6 +6,7 @@ import android.content.Intent; import android.os.Bundle; +import android.util.Log; import android.view.MotionEvent; import android.view.View; import android.widget.Button; @@ -15,6 +16,10 @@ import org.ntlab.acanthus_client.Acanthus; import org.ntlab.acanthus_client.R; import org.ntlab.acanthus_client.databinding.ActivityPaintBinding; +import org.ntlab.acanthus_client.entities.Position; +import org.ntlab.acanthus_client.entities.Stroke; + +import java.util.Collection; //----------------------------------------------------------------- // 描画ページ @@ -127,6 +132,28 @@ binding.buttonAddPage.setText(String.valueOf(i)); } }); + paintViewModel.getStroke().observe(this, new Observer>() { + @Override + public void onChanged(Collection strokes) { + paintCanvas.getCanvas(); + } + }); +//1時的コメントアウトここから + // paintViewModel.getmStrokeNo().observe(this, new Observer() { +// @Override +// public void onChanged(Integer integer) { +// paintViewModel.getPosition(integer); +// } +// }); +// paintViewModel.getMlatestPosition().observe(this, new Observer>() { +// @Override +// public void onChanged(Collection positions) { +// if(positions.size()!=1){ +// //paintCanvas.latestPositionWrite(positions); +// } +// } +// }); +//ここまで } //------------------------------------------------------------------ diff --git a/app/src/main/java/org/ntlab/acanthus_client/views/paint/PaintCanvas.java b/app/src/main/java/org/ntlab/acanthus_client/views/paint/PaintCanvas.java index 4088f9a..2757a84 100644 --- a/app/src/main/java/org/ntlab/acanthus_client/views/paint/PaintCanvas.java +++ b/app/src/main/java/org/ntlab/acanthus_client/views/paint/PaintCanvas.java @@ -16,9 +16,8 @@ import org.ntlab.acanthus_client.entities.Stroke; import java.io.ByteArrayOutputStream; -import java.util.ArrayList; import java.util.Base64; -import java.util.List; +import java.util.Collection; import java.util.concurrent.ScheduledThreadPoolExecutor; import java.util.concurrent.TimeUnit; @@ -27,15 +26,16 @@ //----------------------------------------------------------------- // 描画キャンバスの本体 -public class PaintCanvas extends View implements Runnable { +public class PaintCanvas extends View { private Path path; - private Path path2; + private Path clonepath; + private Path latestpath; private Paint paint; - private Paint paint2; + private Paint clonepaint; + private Paint latestpaint; private PaintViewModel paintViewModel; private ScheduledThreadPoolExecutor thread = new ScheduledThreadPoolExecutor(1); - private int localstrokeNo = 0; private Canvas curCanvas; private Bitmap image; private int curw; @@ -50,18 +50,23 @@ super(context, attrs); path = new Path(); // 図形描画 - path2 = new Path(); // 図形描画 + clonepath = new Path(); // 図形描画 + latestpath = new Path(); // 図形描画 paint = new Paint();//筆の種類 - paint2 = new Paint();//筆の種類 + clonepaint = new Paint();//筆の種類 + latestpaint = new Paint();//筆の種類 paint.setColor(Color.BLACK);//色の指定 paint.setStyle(Paint.Style.STROKE);//線をひく paint.setStrokeWidth(20);//幅 - paint2.setColor(Color.RED);//色の指定 - paint2.setStyle(Paint.Style.STROKE);//線をひく - paint2.setStrokeWidth(20);//幅 + clonepaint.setColor(Color.RED);//色の指定 + clonepaint.setStyle(Paint.Style.STROKE);//線をひく + clonepaint.setStrokeWidth(20);//幅 + latestpaint.setColor(Color.GREEN);//色の指定 + latestpaint.setStyle(Paint.Style.STROKE);//線をひく + latestpaint.setStrokeWidth(20);//幅 //image = Bitmap.createBitmap(640, 480, Bitmap.Config.ARGB_8888); //curCanvas = new Canvas(image); - thread.scheduleWithFixedDelay(this, 1000L, 2000L, TimeUnit.MILLISECONDS); + invalidate(); } @@ -87,9 +92,11 @@ //canvas.setBitmap(image); //curCanvas = canvas; canvas.drawPath(path, paint); - canvas.drawPath(path2, paint2); + canvas.drawPath(clonepath, clonepaint); + canvas.drawPath(latestpath,latestpaint); curCanvas.drawPath(path, paint); - curCanvas.drawPath(path2, paint2); + curCanvas.drawPath(clonepath, clonepaint); + curCanvas.drawPath(latestpath,latestpaint); } //----------------------------------------------------------------- @@ -131,15 +138,14 @@ public void clearCanvas() { paintViewModel.deleteStrokesRequest(); path.reset(); - path2.reset(); + clonepath.reset(); + latestpath.reset(); invalidate(); } //----------------------------------------------------------------- // 押した瞬間の処理 private void onTouched(float x, float y) { - //path = new Path(); - Point curpoint = new Point(); path.moveTo(x, y); invalidate(); } @@ -148,7 +154,6 @@ // 押した後動かした時の処理 private void onTouchedMove(float x, float y) { path.lineTo(x, y); - Point curpoint = new Point(); invalidate(); } @@ -157,40 +162,34 @@ // 押した瞬間の処理 private void onTouched2(float x, float y) { //path2 = new Path(); - path2.moveTo(x, y); + clonepath.moveTo(x, y); invalidate(); } //----------------------------------------------------------------- // 押した後動かした時の処理 private void onTouchedMove2(float x, float y) { - path2.lineTo(x, y); + clonepath.lineTo(x, y); invalidate(); } - //描写するための取得 - public void getCanvas() { - int cnt = 0; - path2.reset(); + //----------------------------------------------------------------- + //----------------------------------------------------------------- + // 押した瞬間の処理 + private void latestOnTouched(float x, float y) { + //path2 = new Path(); + latestpath.moveTo(x, y); invalidate(); - for (Stroke s : paintViewModel.getStroke().getValue()) { - for (Position p : s.getPositions()) { - if (cnt == 0) { - onTouched2(p.getX(), p.getY()); - } else { - if (p.getX() == -1) { - - } else { - onTouchedMove2(p.getX(), p.getY()); - } - } - cnt++; - } - cnt = 0; - } - paintViewModel.deleteStroke(); } + //----------------------------------------------------------------- + // 押した後動かした時の処理 + private void latestOnTouchedMove(float x, float y) { + latestpath.lineTo(x, y); + invalidate(); + } + + @RequiresApi(api = Build.VERSION_CODES.O) public void canvassc() { ByteArrayOutputStream stream = new ByteArrayOutputStream(); @@ -209,13 +208,15 @@ image.recycle(); ResetImage(); } - +//imageの変数をリセット protected void ResetImage(){ super.onSizeChanged(curw, curh, curoldw, curoldh); image = Bitmap.createBitmap(curw, curh, Bitmap.Config.ARGB_8888); curCanvas = new Canvas(image); curCanvas.drawColor(0xFFFFFFFF); } + //imageの変数を初期化 + //SSする度に実行 @Override protected void onSizeChanged(int w, int h, int oldw, int oldh){ curw=w; @@ -228,9 +229,48 @@ curCanvas.drawColor(0xFFFFFFFF); } - // 一定間隔でサーバー上の筆跡を取得する(GET) - @Override - public void run() { - getCanvas(); + + //描写するための取得 + public void getCanvas() { + int cnt = 0; + clonepath.reset(); + invalidate(); + for (Stroke s : paintViewModel.getStroke().getValue()) { + for (Position p : s.getPositions()) { + if (cnt == 0) { + onTouched2(p.getX(), p.getY()); + } else { + if (p.getX() == -1) { + + } else { + onTouchedMove2(p.getX(), p.getY()); + } + } + cnt++; + } + cnt = 0; + } + paintViewModel.deleteStroke(); } + //最新の筆跡を取得して描画 +// public void latestPositionWrite(Collection positions){ +// int cnt = 0; +// latestpath.reset(); +// invalidate(); +// for(Position p: positions){ +// Log.d("", "latestPositionWrite: "+positions.size()); +// Log.d("", "latestPositionWrite: cnt"+cnt); +// if (cnt == 0) { +// //latestOnTouched(p.getX(), p.getY()); +// Log.d("", "latestPositionWrite: "+p.getX()+","+ p.getY()); +// } else { +// if (p.getX() == -1) { +// } else { +// //latestOnTouchedMove(p.getX(), p.getY()); +// } +// } +// cnt++; +// } +// paintViewModel.deletePosition(); +// } } \ No newline at end of file diff --git a/app/src/main/java/org/ntlab/acanthus_client/views/paint/PaintViewModel.java b/app/src/main/java/org/ntlab/acanthus_client/views/paint/PaintViewModel.java index c67d605..f9c4e99 100644 --- a/app/src/main/java/org/ntlab/acanthus_client/views/paint/PaintViewModel.java +++ b/app/src/main/java/org/ntlab/acanthus_client/views/paint/PaintViewModel.java @@ -8,6 +8,7 @@ import androidx.lifecycle.ViewModel; import org.ntlab.acanthus_client.Acanthus; +import org.ntlab.acanthus_client.entities.Position; import org.ntlab.acanthus_client.entities.Stroke; import org.ntlab.acanthus_client.views.paint.models.PageConnectionModel; import org.ntlab.acanthus_client.views.paint.models.PageOperationModel; @@ -27,7 +28,8 @@ private MutableLiveData mCurPageNo = new MutableLiveData<>(1); private MutableLiveData mCurPageId = new MutableLiveData<>(0); private MutableLiveData mPageSize = new MutableLiveData<>(0); - private MutableLiveData mStrokeNo = new MutableLiveData(0); + private MutableLiveData mStrokeNo = new MutableLiveData(0); + private MutableLiveData> mlatestPosition= new MutableLiveData<>(); private MutableLiveData> mStrokes = new MutableLiveData<>(); private int strokeNo = 0; @@ -42,8 +44,8 @@ return this.mStrokes; } - public int getStrokeNo() { - return this.strokeNo; + public MutableLiveData getmStrokeNo() { + return this.mStrokeNo; } public LiveData getPageNo() { @@ -54,6 +56,8 @@ return paintModelContainer; } + public MutableLiveData> getMlatestPosition(){ return this.mlatestPosition;} + //----------------------------------------------------------------- //----------------------------------------------------------------- // init @@ -62,14 +66,16 @@ paintModelContainer.getPaintConnectionModel().init(acanthus); paintModelContainer.getInvitesConnectionModel().init(acanthus); - mStrokes.setValue(new ArrayList<>()); - mStrokes.getValue().add(new Stroke()); - + //mStrokes.setValue(new ArrayList<>()); + //mStrokes.getValue().add(new Stroke()); + mlatestPosition.setValue(new ArrayList<>()); + mlatestPosition.getValue().add(new Position()); // ページの情報初期化 paintModelContainer.getPageConnectionModel().getPage(mCurPageId); paintModelContainer.getPageConnectionModel().getPageSize(mPageSize); - thread.scheduleWithFixedDelay(this, 1000L, 100L, TimeUnit.MILLISECONDS); + thread.scheduleWithFixedDelay(this, 50L, 100L, TimeUnit.MILLISECONDS); + //thread.scheduleWithFixedDelay(this::latestStrokeNo, 50L, 50L, TimeUnit.MILLISECONDS); } //----------------------------------------------------------------- @@ -182,23 +188,34 @@ public void deleteStroke() { this.mStrokes.getValue().clear(); } + public void deletePosition() { + this.mlatestPosition.getValue().clear(); + } //----------------------------------------------------------------- // public void getPageSizeRequest() { paintModelContainer.getPageConnectionModel().getPageSize(mPageSize); } + //----------------------------------------------------------------- + //最新のStrokePositionを取得 + public void getPosition(Integer latestStrokeNo){ + paintModelContainer.getPaintConnectionModel().getLatestStrokePosition(latestStrokeNo,mlatestPosition); + //Log.d("debug", "run: "+mlatestPosition.getValue()); + } //----------------------------------------------------------------- //----------------------------------------------------------------- // 一定間隔でサーバー上の筆跡を取得する(GET) @Override public void run() { -// Log.d("debug", "run: "); paintModelContainer.getPaintConnectionModel().getStrokes(mStrokes); - paintModelContainer.getPaintConnectionModel().getStrokeNo(mStrokeNo); paintModelContainer.getPageConnectionModel().getPageSize(mPageSize); } + //一定間隔でserver上のStrokeNoSizeを返す + public void latestStrokeNo(){ + paintModelContainer.getPaintConnectionModel().getStrokeNo(mStrokeNo); + } //----------------------------------------------------------------- // diff --git a/app/src/main/java/org/ntlab/acanthus_client/views/paint/models/PaintConnectionModel.java b/app/src/main/java/org/ntlab/acanthus_client/views/paint/models/PaintConnectionModel.java index 3e07d5c..3e06146 100644 --- a/app/src/main/java/org/ntlab/acanthus_client/views/paint/models/PaintConnectionModel.java +++ b/app/src/main/java/org/ntlab/acanthus_client/views/paint/models/PaintConnectionModel.java @@ -152,6 +152,25 @@ } }); } + //最新のStrokePositionを取得する + public void getLatestStrokePosition(Integer latestStrokeNo,MutableLiveData> mlatestPosition ){ + final StrokesRest strokesRest = retrofit.create(StrokesRest.class); + + //----------------------------------------------------------------- + // 現在の筆跡番号の取得 + Call> call = strokesRest.getPositions(acanthus.getAid(), latestStrokeNo); + call.enqueue(new Callback>() { + @Override + public void onResponse(Call> call, Response> response) { + if (response.isSuccessful())mlatestPosition.setValue(response.body()); + } + + @Override + public void onFailure(Call> call, Throwable t) { + + } + }); + } //----------------------------------------------------------------- // "Clear"ボタンによる描画の全消去 / サーバー側の筆跡全削除