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 57741c6..5e4f54c 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 @@ -26,7 +26,10 @@ public class PaintActivity extends AppCompatActivity { private PaintCanvas paintCanvas; + private PaintOnionCanvas paintOnionCanvas; + private PaintToolBar paintToolBar; + private PaintScreenShot paintScreenShot; private ActivityPaintBinding binding; private PaintViewModel paintViewModel; @@ -56,14 +59,13 @@ @Override public void onClick(View v) { //bottonタップで表示されてたら非表示にする。 - if(buttonView) { + if (buttonView) { findViewById(R.id.capture).setVisibility(View.INVISIBLE); findViewById(R.id.image).setVisibility(View.INVISIBLE); findViewById(R.id.textView3).setVisibility(View.INVISIBLE); buttonView = false; - } - else { + } else { findViewById(R.id.capture).setVisibility(View.VISIBLE); findViewById(R.id.image).setVisibility(View.VISIBLE); findViewById(R.id.textView3).setVisibility(View.VISIBLE); @@ -113,7 +115,10 @@ setContentView(binding.getRoot()); paintCanvas = (PaintCanvas) findViewById(R.id.myCanvas); - paintCanvas.setPaintViewModel(paintViewModel); + paintCanvas.init(paintViewModel); + + paintOnionCanvas = findViewById(R.id.paintOnionCanvas); + paintOnionCanvas.init(paintViewModel); paintScreenShot = new PaintScreenShot(this); paintToolBar = new PaintToolBar(this, paintCanvas); @@ -126,18 +131,18 @@ //----------------------------------------------------------------- // private void startObserve() { - paintViewModel.getPageNo().observe(this, new Observer() { - @Override - public void onChanged(Integer i) { - binding.buttonAddPage.setText(String.valueOf(i)); - } - }); - paintViewModel.getStroke().observe(this, new Observer>() { + + // 現在のStrokeに変更がある度に取得 + + + // 前のStrokeに変更がある度に取得 + paintViewModel.getPreStrokes().observe(this, new Observer>() { @Override public void onChanged(Collection strokes) { - paintCanvas.getCanvas(); + paintOnionCanvas.updateCanvas(); } }); + //1時的コメントアウトここから // paintViewModel.getmStrokeNo().observe(this, new Observer() { // @Override 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 49cd83a..6b14cb3 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 @@ -27,18 +27,26 @@ //----------------------------------------------------------------- // 描画キャンバスの本体 -public class PaintCanvas extends View { +public class PaintCanvas extends View { + //----------------------------------------------------------------- private Path path; - private Path clonepath; - private Path latestpath; +// private Path clonepath; + + //----------------------------------------------------------------- private Paint paint; - private Paint clonepaint; - private Paint latestpaint; +// private Paint clonepaint; + + //----------------------------------------------------------------- private PaintViewModel paintViewModel; - private ScheduledThreadPoolExecutor thread = new ScheduledThreadPoolExecutor(1); + + //----------------------------------------------------------------- + private PaintOnionCanvas paintOnionCanvas; + private Canvas curCanvas; private Bitmap image; + + //----------------------------------------------------------------- private int curw; private int curh; private int curoldw; @@ -51,26 +59,21 @@ public PaintCanvas(Context context, @Nullable AttributeSet attrs) { super(context, attrs); - pen = new Pen(255,0,0,0,20); - //pen =new Pen(Color.BLACK,20);//新しくPenクラスを作り色と幅の値を設定 + pen = new Pen(255, 0, 0, 0, 20); + + //----------------------------------------------------------------- path = new Path(); // 図形描画 - clonepath = new Path(); // 図形描画 - latestpath = new Path(); // 図形描画 paint = new Paint();//筆の種類 - clonepaint = new Paint();//筆の種類 - latestpaint = new Paint();//筆の種類 - paint.setColor(Color.argb(pen.getAlpha(),pen.getRed(),pen.getGreen(),pen.getBlue()));//色の指定 + paint.setColor(Color.argb(pen.getAlpha(), pen.getRed(), pen.getGreen(), pen.getBlue()));//色の指定 paint.setStyle(Paint.Style.STROKE);//線をひく paint.setStrokeWidth(pen.getThickness());//幅 - 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); + //----------------------------------------------------------------- +// clonepaint = new Paint();//筆の種類 +// clonepath = new Path(); // 図形描画 +// clonepaint.setColor(Color.RED);//色の指定 +// clonepaint.setStyle(Paint.Style.STROKE);//線をひく +// clonepaint.setStrokeWidth(20);//幅 invalidate(); } @@ -81,11 +84,14 @@ return curCanvas; } - public Pen getPen(){return pen;} + public Pen getPen() { + return pen; + } //----------------------------------------------------------------- - // setter - public void setPaintViewModel(PaintViewModel paintViewModel) { + //----------------------------------------------------------------- + // init + public void init(PaintViewModel paintViewModel) { this.paintViewModel = paintViewModel; } @@ -95,18 +101,14 @@ @Override protected void onDraw(Canvas canvas) { super.onDraw(curCanvas); - //canvas.setBitmap(image); - //curCanvas = canvas; -// paint.setColor(pen.getColor()); -// paint.setStrokeWidth(pen.getThickness()); - paint.setColor(Color.argb(pen.getAlpha(),pen.getRed(),pen.getGreen(),pen.getBlue())); + paint.setColor(Color.argb(pen.getAlpha(), pen.getRed(), pen.getGreen(), pen.getBlue())); paint.setStrokeWidth(pen.getThickness()); + canvas.drawPath(path, paint); - canvas.drawPath(clonepath, clonepaint); - canvas.drawPath(latestpath,latestpaint); +// canvas.drawPath(clonepath, clonepaint); + curCanvas.drawPath(path, paint); - curCanvas.drawPath(clonepath, clonepaint); - curCanvas.drawPath(latestpath,latestpaint); +// curCanvas.drawPath(clonepath, clonepaint); } //----------------------------------------------------------------- @@ -148,8 +150,14 @@ public void clearCanvas() { paintViewModel.deleteStrokesRequest(); path.reset(); - clonepath.reset(); - latestpath.reset(); +// clonepath.reset(); + invalidate(); + } + + //----------------------------------------------------------------- + // ページ切り替え時に描画をリセット + public void switchPage(){ + path.reset(); invalidate(); } @@ -170,36 +178,21 @@ //----------------------------------------------------------------- //----------------------------------------------------------------- // 押した瞬間の処理 - private void onTouched2(float x, float y) { - //path2 = new Path(); - clonepath.moveTo(x, y); - invalidate(); - } +// private void onTouched2(float x, float y) { +// //path2 = new Path(); +//// clonepath.moveTo(x, y); +// invalidate(); +// } //----------------------------------------------------------------- // 押した後動かした時の処理 - private void onTouchedMove2(float x, float y) { - clonepath.lineTo(x, y); - invalidate(); - } +// private void onTouchedMove2(float x, float y) { +// clonepath.lineTo(x, y); +// invalidate(); +// } //----------------------------------------------------------------- //----------------------------------------------------------------- - // 押した瞬間の処理 - private void latestOnTouched(float x, float y) { - //path2 = new Path(); - latestpath.moveTo(x, y); - invalidate(); - } - - //----------------------------------------------------------------- - // 押した後動かした時の処理 - 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(); @@ -208,79 +201,63 @@ String encode = Base64.getEncoder().encodeToString(byteArray); Log.d("motion", "=====================================up======================================================"); Log.d("motion", "=====================================up======================================================"); - int stringcnt=0; - int last=0; - for(int i = 0; i positions){ +// //----------------------------------------------------------------- +// //描写するための取得 +// public void getCanvas() { // int cnt = 0; -// latestpath.reset(); +// clonepath.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) { +// for (Stroke s : paintViewModel.getStroke().getValue()) { +// for (Position p : s.getPositions()) { +// if (cnt == 0) { +// onTouched2(p.getX(), p.getY()); // } else { -// //latestOnTouchedMove(p.getX(), p.getY()); +// if (p.getX() == -1) { +// +// } else { +// onTouchedMove2(p.getX(), p.getY()); +// } // } +// cnt++; // } -// cnt++; +// cnt = 0; // } -// paintViewModel.deletePosition(); +// paintViewModel.deleteStroke(); // } + //----------------------------------------------------------------- } \ No newline at end of file diff --git a/app/src/main/java/org/ntlab/acanthus_client/views/paint/PaintOnionCanvas.java b/app/src/main/java/org/ntlab/acanthus_client/views/paint/PaintOnionCanvas.java new file mode 100644 index 0000000..cbedc40 --- /dev/null +++ b/app/src/main/java/org/ntlab/acanthus_client/views/paint/PaintOnionCanvas.java @@ -0,0 +1,88 @@ +package org.ntlab.acanthus_client.views.paint; + +import android.content.Context; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.Paint; +import android.graphics.Path; +import android.os.health.PackageHealthStats; +import android.util.AttributeSet; +import android.view.View; + +import androidx.annotation.Nullable; + +import org.ntlab.acanthus_client.entities.Position; +import org.ntlab.acanthus_client.entities.Stroke; + +import java.lang.reflect.Array; +import java.util.ArrayList; +import java.util.ConcurrentModificationException; +import java.util.List; + +public class PaintOnionCanvas extends View{ + + //----------------------------------------------------------------- + private Path path = new Path(); + private Paint paint = new Paint(); + private PaintViewModel paintViewModel; + + private Canvas canvas; + + //----------------------------------------------------------------- + //----------------------------------------------------------------- + public PaintOnionCanvas(Context context, @Nullable AttributeSet attrs) { + super(context, attrs); + } + + //----------------------------------------------------------------- + // + public void init(PaintViewModel paintViewModel) { + this.paintViewModel = paintViewModel; + + paint.setColor(Color.argb(40, 255, 0, 0)); + paint.setStyle(Paint.Style.STROKE); + paint.setStrokeWidth(20); + + invalidate(); + } + + //----------------------------------------------------------------- + @Override + protected void onDraw(Canvas canvas) { + super.onDraw(canvas); + + canvas.drawPath(path, paint); + } + + //----------------------------------------------------------------- + // + public void updateCanvas(){ + int cnt = 0; + path.reset(); + + for (Stroke s : paintViewModel.getPreStrokes().getValue()) { + for (Position p : s.getPositions()) { + if (cnt == 0) + path.moveTo(p.getX(), p.getY()); + else { + if (p.getX() != -1) + path.lineTo(p.getX(), p.getY()); + } + invalidate(); + cnt++; + } + cnt = 0; + } + paintViewModel.deleteStroke(); + } + + + //----------------------------------------------------------------- + // + public void clearCanvas() { + path.reset(); + invalidate(); + } + //----------------------------------------------------------------- + +} 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 f9c4e99..25c2811 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 @@ -27,10 +27,14 @@ private MutableLiveData mCurPageNo = new MutableLiveData<>(1); private MutableLiveData mCurPageId = new MutableLiveData<>(0); + private MutableLiveData mPrePageId = new MutableLiveData<>(0); + private MutableLiveData mPageSize = new MutableLiveData<>(0); private MutableLiveData mStrokeNo = new MutableLiveData(0); - private MutableLiveData> mlatestPosition= new MutableLiveData<>(); + + private MutableLiveData> mlatestPosition = new MutableLiveData<>(); private MutableLiveData> mStrokes = new MutableLiveData<>(); + private MutableLiveData> mPreStroke = new MutableLiveData<>(); private int strokeNo = 0; private ScheduledThreadPoolExecutor thread = new ScheduledThreadPoolExecutor(1); @@ -40,6 +44,11 @@ //----------------------------------------------------------------- // getter + + public LiveData> getPreStrokes() { + return this.mPreStroke; + } + public MutableLiveData> getStroke() { return this.mStrokes; } @@ -56,7 +65,9 @@ return paintModelContainer; } - public MutableLiveData> getMlatestPosition(){ return this.mlatestPosition;} + public MutableLiveData> getMlatestPosition() { + return this.mlatestPosition; + } //----------------------------------------------------------------- //----------------------------------------------------------------- @@ -66,16 +77,14 @@ paintModelContainer.getPaintConnectionModel().init(acanthus); paintModelContainer.getInvitesConnectionModel().init(acanthus); - //mStrokes.setValue(new ArrayList<>()); - //mStrokes.getValue().add(new Stroke()); mlatestPosition.setValue(new ArrayList<>()); mlatestPosition.getValue().add(new Position()); // ページの情報初期化 + paintModelContainer.getPageOperationModel().initEditingPageNo(mCurPageNo); paintModelContainer.getPageConnectionModel().getPage(mCurPageId); paintModelContainer.getPageConnectionModel().getPageSize(mPageSize); - thread.scheduleWithFixedDelay(this, 50L, 100L, TimeUnit.MILLISECONDS); - //thread.scheduleWithFixedDelay(this::latestStrokeNo, 50L, 50L, TimeUnit.MILLISECONDS); + thread.scheduleWithFixedDelay(this, 50L, 1000L, TimeUnit.MILLISECONDS); } //----------------------------------------------------------------- @@ -142,6 +151,7 @@ pageOperationModel.incrementPageNo(mCurPageNo, mPageSize.getValue()); pageConnectionModel.getPage(mCurPageId); + updatePrePageId(); } //----------------------------------------------------------------- @@ -152,6 +162,14 @@ pageOperationModel.decrementPageNo(mCurPageNo); pageConnectionModel.getPage(mCurPageId); + updatePrePageId(); + } + + //----------------------------------------------------------------- + // ひとつ前のページを記憶する + private void updatePrePageId(){ + PageConnectionModel pageConnectionModel = paintModelContainer.getPageConnectionModel(); + pageConnectionModel.getPrePageId(mPrePageId); } //----------------------------------------------------------------- @@ -184,36 +202,36 @@ //----------------------------------------------------------------- //----------------------------------------------------------------- - // + // 筆跡の削除 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() { + + // 現在のStrokeと1ページ前のStrokeを取得 paintModelContainer.getPaintConnectionModel().getStrokes(mStrokes); + paintModelContainer.getPaintConnectionModel().getPreStrokes(mPreStroke, mPrePageId); + paintModelContainer.getPageConnectionModel().getPageSize(mPageSize); } + //一定間隔でserver上のStrokeNoSizeを返す - public void latestStrokeNo(){ + public void latestStrokeNo() { paintModelContainer.getPaintConnectionModel().getStrokeNo(mStrokeNo); } diff --git a/app/src/main/java/org/ntlab/acanthus_client/views/paint/models/PageConnectionModel.java b/app/src/main/java/org/ntlab/acanthus_client/views/paint/models/PageConnectionModel.java index fd4ddc6..750f045 100644 --- a/app/src/main/java/org/ntlab/acanthus_client/views/paint/models/PageConnectionModel.java +++ b/app/src/main/java/org/ntlab/acanthus_client/views/paint/models/PageConnectionModel.java @@ -102,7 +102,7 @@ //----------------------------------------------------------------- // ページ情報を取得するリクエスト - public void getPage(MutableLiveData pageId) { + public void getPage(MutableLiveData mPageId) { final PagesRest pagesRest = retrofit.create(PagesRest.class); Call call = pagesRest.getPage(acanthus.getAid(), acanthus.getEditingPageNo()); @@ -110,10 +110,11 @@ @Override public void onResponse(Call call, Response response) { if (response.isSuccessful()) { - //acanthus.setEditingPageId(response.body()); + // ページ番号とページIDを取得する acanthus.setEditingPageNo(response.body().getPageNo()); acanthus.setEditingPageId(response.body().getPid()); + mPageId.setValue(response.body().getPid()); Log.d("pid", acanthus.getEditingPageId().toString()); } @@ -127,4 +128,28 @@ } //----------------------------------------------------------------- + // 前のページのIDを取得する + public void getPrePageId(MutableLiveData mPrePageId) { + final PagesRest pagesRest = retrofit.create(PagesRest.class); + + // ページが後ろにあれば取得 + if (1 < acanthus.getEditingPageNo()) { + Call call = pagesRest.getPage(acanthus.getAid(), acanthus.getEditingPageNo() - 1); + call.enqueue(new Callback() { + @Override + public void onResponse(Call call, Response response) { + if (response.isSuccessful()) { + mPrePageId.setValue(response.body().getPid()); + } + } + + @Override + public void onFailure(Call call, Throwable t) { + Log.d("failure", "omg"); + } + }); + } + } + + //----------------------------------------------------------------- } diff --git a/app/src/main/java/org/ntlab/acanthus_client/views/paint/models/PageOperationModel.java b/app/src/main/java/org/ntlab/acanthus_client/views/paint/models/PageOperationModel.java index 2a0ac7c..5d6aad6 100644 --- a/app/src/main/java/org/ntlab/acanthus_client/views/paint/models/PageOperationModel.java +++ b/app/src/main/java/org/ntlab/acanthus_client/views/paint/models/PageOperationModel.java @@ -47,6 +47,12 @@ } //----------------------------------------------------------------- + // 編集中のページ番号を初期化する + public void initEditingPageNo(MutableLiveData mCurPageNo) { + mCurPageNo.setValue(acanthus.getEditingPageNo()); + } + + //----------------------------------------------------------------- //----------------------------------------------------------------- // ページを進める public void incrementPageNo(MutableLiveData mPageNo, Integer pageSize) { 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 3e06146..2df9ae9 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 @@ -68,14 +68,13 @@ //----------------------------------------------------------------- // ストローク追加API Call call = strokesRest.addStroke( - acanthus.getAid(), acanthus.getEditingPageId(), 0, acanthus.getPreferenceUid(),mStrokeNo, acanthus.getPreferenceToken(), + acanthus.getAid(), acanthus.getEditingPageId(), 0, acanthus.getPreferenceUid(), mStrokeNo, acanthus.getPreferenceToken(), 0, 0, 10); // strokeNoを更新 call.enqueue(new Callback() { @Override public void onResponse(Call call, Response response) { - if (response.isSuccessful()); } @Override @@ -133,6 +132,32 @@ } //----------------------------------------------------------------- + // 前のページの全strokeを取得する + public void getPreStrokes(MutableLiveData> preStrokes, LiveData prePid) { + + // 前のページが存在するときのみ + if (1 < acanthus.getEditingPageNo()) { + + final StrokesRest strokesRest = retrofit.create(StrokesRest.class); + + //----------------------------------------------------------------- + // 筆跡追加API + Call> call = strokesRest.getStrokes(acanthus.getAid(), prePid.getValue(), 0); + call.enqueue(new Callback>() { + @Override + public void onResponse(Call> call, Response> response) { + if (response.isSuccessful()) preStrokes.setValue(response.body()); + } + + @Override + public void onFailure(Call> call, Throwable t) { + Log.d("a", "onFailure: "); + } + }); + } + } + + //----------------------------------------------------------------- // 現在のstrokeNoを取得する public void getStrokeNo(MutableLiveData mStrokeNo) { final LayersRest layersRest = retrofit.create(LayersRest.class); @@ -152,25 +177,6 @@ } }); } - //最新の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"ボタンによる描画の全消去 / サーバー側の筆跡全削除 diff --git a/app/src/main/res/layout/activity_paint.xml b/app/src/main/res/layout/activity_paint.xml index dd4c6ff..4dffcfa 100644 --- a/app/src/main/res/layout/activity_paint.xml +++ b/app/src/main/res/layout/activity_paint.xml @@ -20,49 +20,14 @@ app:layout_constraintTop_toTopOf="parent" app:layout_constraintVertical_bias="1.0" /> -