diff --git a/app/src/main/java/org/ntlab/acanthus_client/views/login/LoginScreenViewModel.java b/app/src/main/java/org/ntlab/acanthus_client/views/login/LoginScreenViewModel.java index 8a1d2a8..2af6024 100644 --- a/app/src/main/java/org/ntlab/acanthus_client/views/login/LoginScreenViewModel.java +++ b/app/src/main/java/org/ntlab/acanthus_client/views/login/LoginScreenViewModel.java @@ -1,5 +1,6 @@ package org.ntlab.acanthus_client.views.login; +import android.util.Log; import android.widget.EditText; import androidx.annotation.RestrictTo; @@ -63,6 +64,7 @@ @Override public void onFailure(Call call, Throwable t) { + Log.d("login:", "failed"); } }); } 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 f9d5aea..a6e25ad 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 @@ -12,22 +12,11 @@ import android.view.MotionEvent; import android.view.View; -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.resources.HelloWorldRest; -import org.ntlab.acanthus_client.resources.gallery.StrokesRest; +import org.ntlab.acanthus_client.views.paint.page.Point; -import java.io.BufferedWriter; import java.io.ByteArrayOutputStream; -import java.io.File; -import java.io.FileNotFoundException; -import java.io.FileOutputStream; -import java.io.FileWriter; -import java.io.IOException; -import java.io.PrintWriter; -import java.nio.charset.StandardCharsets; -import java.util.ArrayList; import java.util.Base64; import java.util.List; import java.util.concurrent.ScheduledThreadPoolExecutor; @@ -35,15 +24,6 @@ import androidx.annotation.Nullable; import androidx.annotation.RequiresApi; -import androidx.lifecycle.LiveData; -import androidx.lifecycle.MutableLiveData; - -import retrofit2.Call; -import retrofit2.Callback; -import retrofit2.Response; -import retrofit2.Retrofit; -import retrofit2.converter.jackson.JacksonConverterFactory; -import retrofit2.converter.scalars.ScalarsConverterFactory; //----------------------------------------------------------------- // 描画キャンバスの本体 @@ -56,7 +36,7 @@ private PaintViewModel paintViewModel; private ScheduledThreadPoolExecutor thread = new ScheduledThreadPoolExecutor(1); private int localstrokeNo = 0; - private Canvas canvas; + private Canvas curCanvas; private Bitmap image; //----------------------------------------------------------------- @@ -74,13 +54,21 @@ paint2.setColor(Color.RED);//色の指定 paint2.setStyle(Paint.Style.STROKE);//線をひく paint2.setStrokeWidth(20);//幅 - thread.scheduleWithFixedDelay(this, 1000L, 2000L, TimeUnit.MILLISECONDS); image = Bitmap.createBitmap(640, 480, Bitmap.Config.ARGB_8888); - canvas = new Canvas(image); + curCanvas = new Canvas(image); + + thread.scheduleWithFixedDelay(this, 1000L, 2000L, TimeUnit.MILLISECONDS); + invalidate(); } //----------------------------------------------------------------- + // getter + public Canvas getCurCanvas() { + return curCanvas; + } + + //----------------------------------------------------------------- // setter public void setPaintViewModel(PaintViewModel paintViewModel) { this.paintViewModel = paintViewModel; @@ -93,6 +81,9 @@ protected void onDraw(Canvas canvas) { super.onDraw(canvas); //canvas.setBitmap(image); + + curCanvas = canvas; + canvas.drawPath(path, paint); canvas.drawPath(path2, paint2); } @@ -119,6 +110,7 @@ Log.d("motion", "move"); onTouchedMove(x, y); paintViewModel.addPositionRequest(x, y); + curCanvas.drawBitmap(image,x,y,paint); break; case MotionEvent.ACTION_UP: @@ -195,19 +187,38 @@ } @RequiresApi(api = Build.VERSION_CODES.O) - public void canvassc(Bitmap image) { + public void canvassc() { + image = Bitmap.createBitmap(640, 480, Bitmap.Config.ARGB_8888); + curCanvas = new Canvas(image); + draw(curCanvas); + + ByteArrayOutputStream stream = new ByteArrayOutputStream(); image.compress(Bitmap.CompressFormat.PNG, 100, stream); byte[] byteArray = stream.toByteArray(); + byte[] encode = Base64.getEncoder().encode(byteArray); + Log.d("motion", "=====================================up======================================================"); + Log.d("motion", "=====================================up======================================================"); + Log.d("byteArray", byteArray.toString()); + Log.d("byteImage", encode.toString()); + + System.out.println("size:" + encode.length); + + for (int i = 0; i < encode.length; i++) { + Byte b = encode[i]; + System.out.println("b[" + i + "]" + b.toString()); + } + image.recycle(); - byte[] a = Base64.getEncoder().encode(byteArray); - Log.d("motion", "=====================================up======================================================"); - Log.d("motion", "=====================================up======================================================"); - Log.d("byteimage", "canvassc: " + a.toString()); + } - public Bitmap getBitmapimg() { - return this.image; + @Override + protected void onSizeChanged(int w, int h, int oldw, int oldh){ + super.onSizeChanged(w, h, oldw, oldh); + image = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888); + curCanvas = new Canvas(image); + curCanvas.drawColor(0xFFFFFFFF); } // 一定間隔でサーバー上の筆跡を取得する(GET) @@ -215,4 +226,52 @@ public void run() { getCanvas(); } + + private void drawCanvas(Canvas canvas, List pts){ + if (pts.size() > 1){ + Path path = new Path(); + final int SMOOTH_VAL = 6; + for(int i = pts.size() - 2; i < pts.size(); i++){ + if(i >= 0){ + Point point = pts.get(i); + + if(i == 0){ + Point next = pts.get(i + 1); + point.setDx(((next.getX() - point.getX()) / SMOOTH_VAL)); + point.setDy(((next.getY() - point.getY()) / SMOOTH_VAL)); + } + else if(i == pts.size() - 1){ + Point prev = pts.get(i - 1); + point.setDx(((point.getX() - prev.getX()) / SMOOTH_VAL)); + point.setDy(((point.getY() - prev.getY()) / SMOOTH_VAL)); + } + else{ + Point next = pts.get(i + 1); + Point prev = pts.get(i - 1); + point.setDx( ((next.getX() - prev.getX()) / SMOOTH_VAL)); + point.setDy( ((next.getY() - prev.getY()) / SMOOTH_VAL)); + } + } + } + + boolean first = true; + for(int i = 0; i < pts.size(); i++){ + Point point = pts.get(i); + if(first){ + first = false; + path.moveTo(point.getX(), point.getX()); + } + else{ + Point prev = pts.get(i - 1); + path.cubicTo(prev.getX() + prev.getDx(), prev.getY() + prev.getDy(), point.getX() - point.getDx(), point.getY() - point.getDy(), point.getX(), point.getY()); + } + } + canvas.drawPath(path, paint); + } else { + if (pts.size() == 1) { + Point point = pts.get(0); + canvas.drawCircle(point.getX(), point.getY(), 2, paint); + } + } + } } \ No newline at end of file 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 b46cb6f..071a083 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 @@ -1,9 +1,11 @@ package org.ntlab.acanthus_client.views.paint; import android.content.Intent; +import android.os.Build; import android.view.MenuItem; import androidx.annotation.NonNull; +import androidx.annotation.RequiresApi; import androidx.appcompat.app.AppCompatActivity; import com.google.android.material.bottomnavigation.BottomNavigationView; @@ -31,6 +33,7 @@ // ナビゲーションバーのタッチ監視 private void setNavigationListener(AppCompatActivity appCompatActivity, PaintCanvas paintCanvas) { this.onNavigationItemSelectedListener = new BottomNavigationView.OnNavigationItemSelectedListener() { + @RequiresApi(api = Build.VERSION_CODES.O) @Override public boolean onNavigationItemSelected(@NonNull MenuItem item) { switch (item.getItemId()) { @@ -51,7 +54,7 @@ //----------------------------------------------------------------- case R.id.navigation_page: - paintCanvas.canvassc(paintCanvas.getBitmapimg()); + paintCanvas.canvassc(); transitionPageActivity(appCompatActivity); return true; diff --git a/app/src/main/java/org/ntlab/acanthus_client/views/paint/page/Point.java b/app/src/main/java/org/ntlab/acanthus_client/views/paint/page/Point.java new file mode 100644 index 0000000..a81f053 --- /dev/null +++ b/app/src/main/java/org/ntlab/acanthus_client/views/paint/page/Point.java @@ -0,0 +1,40 @@ +package org.ntlab.acanthus_client.views.paint.page; + +import java.io.Serializable; + +public class Point implements Serializable { + float x, y; + float dx, dy; + + public float getDx() { + return dx; + } + + public float getDy() { + return dy; + } + + public void setDx(float dx) { + this.dx = dx; + } + + public void setDy(float dy) { + this.dy = dy; + } + + public float getX() { + return x; + } + + public float getY() { + return y; + } + + public void setX(float x) { + this.x = x; + } + + public void setY(float y) { + this.y = y; + } +}