2016-11-29 4 views
9

मैं आईफोन के अमेज़ॅनोग्राफ के समान एप्लिकेशन पर काम कर रहा हूं जिसे कैलिडोस्कोप या मंडला भी कहा जाता है।आईफोन के अमेज़ॅनोग्राफ ऐप के समान कैनवास सामग्री को कॉपी करें

अब तक मैं कोशिश की है और कहा कि एप्लिकेशन Circular canvas

मैं कैनवास विस्तार किया है और एक कस्टम कैनवास बना दिया है, जहां मैं छवि के लिए इसी तरह 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; 
} 
} 

मैं आंकड़ा Without Drawing नीचे

मैं एक बॉक्स में आकर्षित करने के लिए चाहते हैं के लिए कार्यक्षमता को प्राप्त करने में सक्षम नहीं हूँ और यह अन्य बक्से में कॉपी किया जाना चाहिए के लिए अपने कैनवास वर्ग कोड है । यह कैसे प्राप्त किया जा सकता है एक छोटी सी गाइड भी मददगार होगा?

With Drawing Drawing continues from one box to another

+0

क्या आप कृपया मेरे समाधान की जांच कर सकते हैं और प्रतिक्रिया दे सकते हैं? मुझे बस दो प्रतिनिधि अंक काट दिया गया क्योंकि उत्तर समय सीमा से पहले स्वीकार नहीं किया गया था। धन्यवाद –

उत्तर

1
<?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); 
       } 
      } 
     } 
    } 

आप संसाधनों का उपयोग करने की तरह मैंने किया था की जरूरत नहीं है, लेकिन अगर आप मुश्किल अपने ऐप में एक आकार को कोड करें, सुनिश्चित करें कि आप कोर्रेक प्राप्त करने के लिए स्क्रीन घनत्व से गुणा करें टी पिक्सेल ऑफसेट्स।

+0

मैंने आपके समाधान की कोशिश की है लेकिन यह षट्भुज के लिए काम नहीं करता है। यह सामग्री की प्रतिलिपि बनाता है लेकिन केवल तभी जब हम स्क्रीन के बीच में आते हैं, लेकिन जब पक्ष पर चित्रण करते हैं तो यह ठीक से काम नहीं करता है। –

+0

मैंने सोचा कि मैं जवाब को सही कर दूंगा, भले ही मुझे अब बक्षीस न मिले –

1

शायद तुम सरणी में निशान बचाने के लिए, और अन्य ड्राइंग विचारों को पेस्ट कर सकते हैं

@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 + का पता लगाने के 3 = बात drawed उपयोगकर्ता द्वारा जब आप वास्तविक समय में या शायद वास्तविक समय में, आप इस दृश्य पर खींचे गए अंक अन्य दृश्य में भेज सकते हैं ... या जब उपयोगकर्ता लिखते हैं तो स्ट्रिंग भेजते हैं और अंक निकालते हैं ...

वैसे यह सिर्फ एक विचार है, उम्मीद है कि मैंने मदद की;)

संबंधित मुद्दे