Intereting Posts

Скопируйте содержимое холста на другой холст, похожий на приложение amaziograph iphone

Я работаю над приложением, похожим на Amaziograph iPhone, также известным как калейдоскоп или мандала.

До сих пор я пробовал и сделал один конкретный макет этого приложения Круглый холст

Я расширил холст и сделал пользовательский холст, где я разделил холст на 9 частей, похожих на изображение и в методе рисования. Я повернул холст и скопировал его содержимое в цикл. Вот мой код класса холста для формы круговой деления

import android.content.Context; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.Path; import android.graphics.PorterDuff; import android.util.AttributeSet; import android.view.MotionEvent; import android.view.View; import com.madala.mandaladrawing.R; import com.madala.mandaladrawing.model.DrawingEvent; import com.madala.mandaladrawing.utils.Common; public class CanvasView extends View { private final Context context; private Bitmap bitmap; private Canvas bitmapCanvas; private Paint bitmapPaint; private Path path = new Path(); private Paint brushPaint; private int numberOfMirror = 5; private int cx, cy; public CanvasView(Context context) { super(context); this.context = context; init(); } public CanvasView(Context context, AttributeSet attrs) { super(context, attrs); this.context = context; init(); } public CanvasView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); this.context = context; init(); } private void init() { brushPaint = createPaint(); brushPaint.setColor(0xffffffff); } @Override protected void onDraw(Canvas canvas) { canvas.drawBitmap(bitmap, 0, 0, bitmapPaint); canvas.drawPath(path, brushPaint); for (int i = 1; i < numberOfMirror; i++) { canvas.rotate(360f / numberOfMirror, cx, cy); canvas.drawPath(path, brushPaint); } } public void clearCanvas(){ bitmapCanvas.drawColor(0, PorterDuff.Mode.CLEAR); invalidate(); } @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh); setLayerType(View.LAYER_TYPE_HARDWARE, null); bitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888); bitmapCanvas = new Canvas(bitmap); bitmapPaint = new Paint(Paint.DITHER_FLAG); cx = w / 2; cy = h / 2; } @Override public boolean onTouchEvent(MotionEvent event) { float x = event.getX(); float y = event.getY(); switch (event.getAction()) { case MotionEvent.ACTION_DOWN: path.moveTo(x, y); break; case MotionEvent.ACTION_MOVE: path.lineTo(x, y); break; case MotionEvent.ACTION_UP: path.lineTo(x, y); drawToCanvas(path, brushPaint); path.reset(); break; default: return false; } invalidate(); return true; } private void drawToCanvas(Path path, Paint brushPaint) { bitmapCanvas.drawPath(path, brushPaint); for (int i = 1; i < numberOfMirror; i++) { bitmapCanvas.rotate(360f / numberOfMirror, cx, cy); bitmapCanvas.drawPath(path, brushPaint); } } public int getCurrentBrushColor() { return brushPaint.getColor(); } public void setCurrentBrushColor(int color) { brushPaint.setColor(color); } private Paint createPaint() { Paint p = new Paint(Paint.ANTI_ALIAS_FLAG); p.setStrokeWidth(8f); p.setStyle(Paint.Style.STROKE); p.setStrokeJoin(Paint.Join.ROUND); p.setStrokeCap(Paint.Cap.ROUND); return p; } } 

Я не могу достичь функциональности ниже Без рисунка

Я хочу рисовать в одной коробке, и ее нужно скопировать в другие поля. Как это может быть достигнуто с помощью небольшого руководства?

С рисунком Рисование продолжается от одной коробки к другой

Solutions Collecting From Web of "Скопируйте содержимое холста на другой холст, похожий на приложение amaziograph iphone"

Возможно, вы можете сохранить трассировки в массиве и вставить его в другие виды чертежей

 @Override public boolean onTouchEvent(MotionEvent event) { float x = event.getX(); float y = event.getY(); switch (event.getAction()) { case MotionEvent.ACTION_DOWN: //save initial x,y into array or send it to other canvas /*public general variable*/ String Drawing +="[[x,y]"; path.moveTo(x, y); break; case MotionEvent.ACTION_MOVE: //save middle x,y into array or send it to other canvas String Drawing +=",[x,y]"; path.lineTo(x, y); break; case MotionEvent.ACTION_UP: //save last point into array or send it to other canvas String Drawing +=",[x,y]]"; path.lineTo(x, y); drawToCanvas(path, brushPaint); path.reset(); break; default: return false; } invalidate(); return true; } 

Результирующей строкой должны быть все пользовательские трассы

 [[x,y],[x,y],[x,y],[x,y],[x,y]], trace 1 [[x,y],[x,y],[x,y],[x,y],[x,y]], trace 2 [[x,y],[x,y],[x,y],[x,y],[x,y]], trace 3 etc.. 

Trace1 + trace2 + trace 3 = предмет, нарисованный пользователем. Когда вы хотите или, может быть, в режиме реального времени, вы можете отправить точки, нарисованные на этом представлении, на другое представление … или когда пользователи заканчивают писать, отправляя строку и извлекая очки …

Ну это просто идея, надеюсь, я помог;)

 <?xml version="1.0" encoding="utf-8"?> <resources> <!-- this has changed from first answer --> <dimen name="translation_size">30dp</dimen> </resources> 

  int size = getResources().getDimensionPixelSize(R.dimen.translation_size); 

  private void drawToCanvas(Path path, Paint brushPaint) { bitmapCanvas.drawPath(path, brushPaint); // just render normally } @Override protected void onDraw(Canvas canvas) { canvas.drawPath(path, brushPaint); int xMax = getWidth() / size; int yMax = getHeight() / size; int xMin = -xMax; int yMin = -yMax; for (int x = xMin; x <= xMax; x++) { for (int y = yMin; y <= yMax; y++) { if ((Math.abs(x % 6) == 0 && Math.abs(y % 4) == 0) || (Math.abs(x % 6) == 3 && Math.abs(y % 4) == 2)) { int xs = x * size; int ys = y * size; canvas.translate(xs, ys); canvas.drawBitmap(bitmap, 0, 0, bitmapPaint); canvas.translate(-xs, -ys); } } } } 

Вам не нужно использовать такие ресурсы, как я, но если вы жестко кодируете размер в своем приложении, убедитесь, что вы умножаетесь на плотность экрана, чтобы получить правильные смещения пикселей.