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 8cf9b0a..7c680f8 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,17 +6,13 @@ import android.content.Intent; import android.os.Bundle; -import android.util.Log; -import android.view.MotionEvent; import android.view.View; import android.widget.Button; import android.widget.TextView; -import android.widget.Toast; 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; @@ -87,7 +83,7 @@ //----------------------------------------------------------------- // 描画全体のクリア public void onClickClear(View view) { - paintCanvas.clearCanvas(); + paintCanvas.deleteStroke(); } //----------------------------------------------------------------- @@ -136,7 +132,7 @@ paintViewModel.getStroke().observe(this, new Observer>() { @Override public void onChanged(Collection strokes) { - paintCanvas.getCanvas(); + paintCanvas.updateCanvas(); } }); 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 ff9c115..bfd5295 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 @@ -19,9 +19,6 @@ import java.io.ByteArrayOutputStream; import java.util.ArrayList; import java.util.Base64; -import java.util.Collection; -import java.util.concurrent.ScheduledThreadPoolExecutor; -import java.util.concurrent.TimeUnit; import androidx.annotation.Nullable; import androidx.annotation.RequiresApi; @@ -30,21 +27,21 @@ // 描画キャンバスの本体 public class PaintCanvas extends View { - //----------------------------------------------------------------- - private Path path; - private Path clonepath; + private PaintViewModel paintViewModel; //----------------------------------------------------------------- - private Paint paint; - private Paint clonepaint; + private Path path = new Path(); + private Paint paint = new Paint(); //----------------------------------------------------------------- - private Paint latestpaint; + // ローカル private ArrayList paints = new ArrayList<>(); private ArrayList paths = new ArrayList<>(); - private ArrayList clonepaints = new ArrayList<>(); - private ArrayList clonepaths = new ArrayList<>(); - private PaintViewModel paintViewModel; + + //----------------------------------------------------------------- + // サーバー + private ArrayList clonePaints = new ArrayList<>(); + private ArrayList clonePaths = new ArrayList<>(); //----------------------------------------------------------------- private PaintOnionCanvas paintOnionCanvas; @@ -65,38 +62,23 @@ 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クラスを作り色と幅の値を設定 - path = new Path(); // 図形描画 - paths.add(path); - /// - clonepath = new Path(); // 図形描画 - paint = new Paint();//筆の種類 - paints.add(paint); - /// - clonepaint = new Paint();//筆の種類 - latestpaint = new Paint();//筆の種類 + paint = 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 = new Paint();//筆の種類 - clonepath = new Path(); // 図形描画 - clonepaint.setColor(Color.RED);//色の指定 - clonepaint.setStyle(Paint.Style.STROKE);//線をひく - clonepaint.setStrokeWidth(20);//幅 + paths.add(new Path()); + paints.add(paint); invalidate(); } //----------------------------------------------------------------- // getter - public Canvas getCurCanvas() { - return curCanvas; - } - public Pen getPen() { return pen; } @@ -115,29 +97,22 @@ protected void onDraw(Canvas canvas) { super.onDraw(curCanvas); canvas.drawColor(0xFFFFFFFF); - 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()); - for (int i = 0; i < clonepaths.toArray().length; i++) { + + for (int i = 0; i < paths.size(); i++) { try { canvas.drawPath(paths.get(i), paints.get(i)); curCanvas.drawPath(paths.get(i), paints.get(i)); } catch (IndexOutOfBoundsException ex) { - - } - try { - canvas.drawPath(clonepaths.get(i), clonepaints.get(i)); - curCanvas.drawPath(clonepaths.get(i), clonepaints.get(i)); - } catch (IndexOutOfBoundsException ex) { - } } - canvas.drawPath(path, paint); - canvas.drawPath(clonepath, clonepaint); - - curCanvas.drawPath(path, paint); - curCanvas.drawPath(clonepath, clonepaint); + for (int i = 0; i < clonePaths.size(); i++) { + try { + canvas.drawPath(clonePaths.get(i), clonePaints.get(i)); + curCanvas.drawPath(clonePaths.get(i), clonePaints.get(i)); + } catch (IndexOutOfBoundsException ex) { + } + } } //----------------------------------------------------------------- @@ -152,27 +127,38 @@ switch (event.getAction()) { case MotionEvent.ACTION_DOWN: Log.d("motion", "+++++++++++++++++++++++++++++++++++++++down======================================================"); - onTouched(x, y); + + paths.add(new Path()); + + paint = new Paint(); + paint.setColor(Color.argb(pen.getAlpha(), pen.getRed(), pen.getGreen(), pen.getBlue()));//色の指定 + paint.setStyle(Paint.Style.STROKE);//線をひく + paint.setStrokeWidth(pen.getThickness()); + + paints.add(paint); + + + if (0 < paths.size()) + onTouched(paths.get(paths.size() - 1), x, y); + paintViewModel.setmStrokeNo(); paintViewModel.addLocalStrokeRequest(x, y, Color.argb(pen.getAlpha(), pen.getRed(), pen.getGreen(), pen.getBlue()), pen.getThickness()); - //paintViewModel.addPositionLocal(x, y); + break; case MotionEvent.ACTION_MOVE: Log.d("motion", "move"); - onTouchedMove(x, y); + if (0 < paths.size()) + onTouchedMove(paths.get(paths.size() - 1), x, y); + paintViewModel.addPositionRequest(x, y); break; case MotionEvent.ACTION_UP: Log.d("motion", "=====================================up======================================================"); paintViewModel.addPositionRequestFirst(); - path = new Path(); - paint = new Paint(); - paint.setColor(Color.argb(pen.getAlpha(), pen.getRed(), pen.getGreen(), pen.getBlue()));//色の指定 - paint.setStyle(Paint.Style.STROKE);//線をひく - paths.add(path); - paints.add(paint); + + break; } @@ -182,56 +168,52 @@ //----------------------------------------------------------------- // 描画クリア - public void clearCanvas() { + public void deleteStroke() { paintViewModel.deleteStrokesRequest(); - paths.clear(); - path.reset(); - paints.clear(); - clonepaths.clear(); - clonepaints.clear(); - clonepath.reset(); + + clearCanvas(); + invalidate(); } //----------------------------------------------------------------- // ページ切り替え時に描画をリセット - public void switchPage() { + public void clearCanvas() { + for (Path p : paths) { + p.reset(); + invalidate(); + } + paths.clear(); + paints.clear(); + + for (Path p : clonePaths) { + p.reset(); + invalidate(); + } + clonePaths.clear(); + clonePaints.clear(); + path.reset(); + invalidate(); } //----------------------------------------------------------------- // 押した瞬間の処理 - private void onTouched(float x, float y) { + private void onTouched(Path path, float x, float y) { path.moveTo(x, y); invalidate(); } //----------------------------------------------------------------- // 押した後動かした時の処理 - private void onTouchedMove(float x, float y) { + private void onTouchedMove(Path path, float x, float y) { path.lineTo(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(); - } - - //----------------------------------------------------------------- - //----------------------------------------------------------------- @RequiresApi(api = Build.VERSION_CODES.O) public void canvassc() { ByteArrayOutputStream stream = new ByteArrayOutputStream(); @@ -250,12 +232,12 @@ } Log.d("encode:", encode.substring(4000 * stringcnt, encode.length())); image.recycle(); - ResetImage(); + resetImage(); } //----------------------------------------------------------------- //imageの変数をリセット - protected void ResetImage() { + protected void resetImage() { super.onSizeChanged(curw, curh, curoldw, curoldh); image = Bitmap.createBitmap(curw, curh, Bitmap.Config.ARGB_8888); curCanvas = new Canvas(image); @@ -267,11 +249,13 @@ // SSする度に実行 @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { + super.onSizeChanged(w, h, oldw, oldh); + curw = w; curh = h; curoldw = oldw; curoldh = oldh; - super.onSizeChanged(w, h, oldw, oldh); + image = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888); curCanvas = new Canvas(image); curCanvas.drawColor(0xFFFFFFFF); @@ -279,26 +263,31 @@ //----------------------------------------------------------------- //描写するための取得 - public void getCanvas() { + public void updateCanvas() { int cnt = 0; - clonepath.reset(); + + for (Path p : clonePaths) p.reset(); + invalidate(); + for (Stroke s : paintViewModel.getStroke().getValue()) { - clonepaint = new Paint(); - clonepath = new Path(); - clonepaint.setColor(Color.argb(Color.alpha(s.getColor()), Color.red(s.getColor()), Color.green(s.getColor()), Color.blue(s.getColor())));//色の指定 - clonepaint.setStrokeWidth(s.getThickness()); - clonepaint.setStyle(Paint.Style.STROKE);//線をひく - clonepaints.add(clonepaint); - clonepaths.add(clonepath); + + Paint paint = new Paint(); + paint.setColor(Color.argb(Color.alpha(s.getColor()), Color.red(s.getColor()), Color.green(s.getColor()), Color.blue(s.getColor())));//色の指定 + paint.setStrokeWidth(s.getThickness()); + paint.setStyle(Paint.Style.STROKE);//線をひく + + clonePaints.add(paint); + clonePaths.add(new Path()); + for (Position p : s.getPositions()) { if (cnt == 0) { - onTouched2(p.getX(), p.getY()); + onTouched(clonePaths.get(clonePaths.size() - 1), p.getX(), p.getY()); } else { if (p.getX() == -1) { } else { - onTouchedMove2(p.getX(), p.getY()); + onTouchedMove(clonePaths.get(clonePaths.size() - 1), p.getX(), p.getY()); } } cnt++; diff --git a/app/src/main/java/org/ntlab/acanthus_client/views/paint/PaintToolBar.java b/app/src/main/java/org/ntlab/acanthus_client/views/paint/PaintToolBar.java index 70dc7f4..e9a30b5 100644 --- a/app/src/main/java/org/ntlab/acanthus_client/views/paint/PaintToolBar.java +++ b/app/src/main/java/org/ntlab/acanthus_client/views/paint/PaintToolBar.java @@ -8,14 +8,11 @@ import androidx.annotation.RequiresApi; import androidx.appcompat.app.AppCompatActivity; import androidx.fragment.app.FragmentManager; -import androidx.fragment.app.FragmentTransaction; import com.google.android.material.bottomnavigation.BottomNavigationView; import org.ntlab.acanthus_client.Acanthus; import org.ntlab.acanthus_client.R; -import org.ntlab.acanthus_client.entities.Pen; -import org.ntlab.acanthus_client.views.MainActivity; import org.ntlab.acanthus_client.views.paint.page.PageActivity; //----------------------------------------------------------------- @@ -50,7 +47,7 @@ //----------------------------------------------------------------- // case R.id.navigation_clear: - paintCanvas.clearCanvas(); + paintCanvas.deleteStroke(); return true; //----------------------------------------------------------------- // @@ -61,6 +58,7 @@ //----------------------------------------------------------------- case R.id.navigation_page: paintCanvas.canvassc(); + paintCanvas.clearCanvas(); transitionPageActivity(appCompatActivity); return true; 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 0814924..12687bf 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 @@ -15,6 +15,7 @@ import java.util.ArrayList; import java.util.Collection; +import java.util.HashMap; import java.util.Random; import java.util.concurrent.ScheduledThreadPoolExecutor; import java.util.concurrent.TimeUnit; @@ -32,7 +33,6 @@ 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 MutableLiveData> mPages = new MutableLiveData<>(new HashMap<>()); @@ -67,14 +67,6 @@ return paintModelContainer; } - public MutableLiveData> getMlatestPosition() { - return this.mlatestPosition; - } - - public MutableLiveData> getMlatestPosition() { - return this.mlatestPosition; - } - //----------------------------------------------------------------- //----------------------------------------------------------------- // init @@ -157,6 +149,7 @@ pageOperationModel.incrementPageNo(mCurPageNo, mPageSize.getValue()); pageConnectionModel.getPage(mCurPageId); + updatePrePageId(); } //----------------------------------------------------------------- @@ -224,10 +217,6 @@ mPreStroke.getValue().clear(); } - public void deletePosition() { - this.mlatestPosition.getValue().clear(); - } - //----------------------------------------------------------------- // public void getPageSizeRequest() { @@ -235,13 +224,6 @@ } //----------------------------------------------------------------- - //最新のStrokePositionを取得 - public void getPosition(Integer latestStrokeNo) { - paintModelContainer.getPaintConnectionModel().getLatestStrokePosition(latestStrokeNo, mlatestPosition); - //Log.d("debug", "run: "+mlatestPosition.getValue()); - } - - //----------------------------------------------------------------- //----------------------------------------------------------------- // 一定間隔でサーバー上の筆跡を取得する(GET) @Override diff --git a/app/src/main/res/layout/activity_paint.xml b/app/src/main/res/layout/activity_paint.xml index 4dffcfa..7d0ecc4 100644 --- a/app/src/main/res/layout/activity_paint.xml +++ b/app/src/main/res/layout/activity_paint.xml @@ -57,13 +57,14 @@ android:id="@+id/button_keep" android:layout_width="50dp" android:layout_height="50dp" + android:layout_marginTop="600dp" android:background="@android:drawable/presence_online" android:backgroundTint="#00bcd4" android:text="✓" android:textColor="#FFFFFF" android:textSize="24sp" app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintHorizontal_bias="0.955" + app:layout_constraintHorizontal_bias="1.0" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" />