2012-02-10 19 views
9

मेरे पास DrawView है। अगर मैं इस दृश्य को छूता हूं तो यह छोटी सर्कल खींचता है। मैं सर्किल खींचने के लिए नहीं बल्कि दृश्य को स्पर्श नहीं करना चाहता हूं - सहायता फ़ंक्शन "सेट पॉइंट्स" के साथ। मैं क्या करता हूं:वर्तमान कैनवास कैसे प्राप्त करें?

package com.samples; 
import ... 

public class DrawView extends View { 
    ArrayList<Point> points = new ArrayList<Point>(); 

    Paint paint = new Paint(); 

    private int pSize = 5; 
    private int pColor = Color.BLACK; 

    public DrawView(Context context, AttributeSet attrs) { 

     super(context, attrs); 

     setFocusable(true); 
     setFocusableInTouchMode(true); 

     this.setOnTouchListener(new View.OnTouchListener() { 
      @Override 
      public boolean onTouch(View v, MotionEvent event) { 
       v.setOnTouchListener(this); 
        Point point = new Point(); 
        point.x = event.getX(); 
        point.y = event.getY(); 
        points.add(point); 
        invalidate(); 
       } 
       return true; 
      } 
     }); 
     requestFocus(); 
    } 

    @Override 
    public void onDraw(Canvas canvas) { 
     for (Point point : points) { 
      canvas.drawCircle(point.x, point.y, pSize, paint); 
     } 
    } 

    public void setPoints(Float xP, Float yP) 
    { 
     Point point = new Point(); 
     point.x = xP; 
     point.y = yP; 
     points.add(point); 
     postInvalidate(); 
    } 
} 

class Point { 
    float x, y; 

    @Override 
    public String toString() { 
     return x + ", " + y; 
    } 
} 

कृपया मुझे बताएं, सेटपॉइंट्स को कैनवास कैसे प्राप्त करें?

अद्यतन: वाह, यह वास्तव में दिलचस्प समस्या है। मेरा DrawView क्षैतिज ScrollView में शामिल है। क्योंकि अगर मैं इस DrawView में सही निर्देशांक सेट करता हूं, तो कोई भी नहीं जानता कि ड्रॉइंग मंडल कहां हैं।

+0

यह प्रश्न समझना मुश्किल है। कृपया इसकी समीक्षा करें – Raffaele

+0

यह समझना आसान नहीं है कि आप क्या हासिल करना चाहते हैं :) सबसे पहले, 'canvas2' को हटाएं: यह आपके विचार के अनुसार काम नहीं करता है। मुझे संदेह है कि आप पहले खींचे गए सर्कल को बनाए रखना चाहते हैं, है ना? यदि यह आपका लक्ष्य है, तो आपको ड्रॉ कॉल का इतिहास बनाए रखना होगा, और इसे दो तरीकों से कर सकते हैं: 1) आप 'प्वाइंट []' सरणी संग्रहीत करते हैं और प्रत्येक सर्कल को 'ऑन ड्रा' में खींचते हैं; या 2) प्रत्येक बार जब एक सर्कल जोड़ा जाता है तो आप 'बिटमैप' – Raffaele

+0

कैश अपडेट करते हैं, मैं इस सर्कल को आकर्षित नहीं करता लेकिन स्क्रीन को स्पर्श नहीं करता! – Leo

उत्तर

4

आप नहीं कर सकते। कैनवास सिस्टम द्वारा प्रबंधित किया जाता है और इसे आपके onDraw() पर भेज दिया जाता है। मुझे समझ में नहीं आता कि आपको वहां से बाहर क्यों चाहिए। बस setPoints इस

public void setPoints(Canvas canvas, Float xP, Float Yp) 

तरह redeclare आप पिछले चित्र की एक कैश रख सकते (या पिछले अंक की दुकान)

+0

अंक pproblem नहीं हैं, मैं इसे रखता हूं। "कैनवास कैनवास" के बारे में: यदि मैं कभी भी कॉल नहीं करता हूं तो मैं क्या कर सकता हूं? – Leo

+1

आपको यह नहीं पता कि एंड्रॉइड आकर्षित कैसे करता है। जब सिस्टम यह पता लगाता है कि किसी विजेट को पेंट करने की आवश्यकता है, तो यह आपके विजेट के दरवाजे पर दस्तक देता है और यह 'ऑन ड्रा (कैनवास)' द्वारा जवाब देता है।इसलिए आपको गारंटी है कि इस विधि को हर बार बुलाया जाएगा। _trigger_ _the_ _repaint_ का एक तरीका 'अवैध()' (या 'postInvalidate') को कॉल करके है। इसलिए आपको कभी भी कॉल करने की आवश्यकता नहीं है, लेकिन सुनिश्चित करें कि एंड्रॉइड इसे आवश्यकता होने पर कॉल करेगा। आपको कॉलबैक की आपूर्ति करने की आवश्यकता है। साथ ही, कृपया निर्दिष्ट करें कि "मैं मंडलियों को आकर्षित करना चाहता हूं लेकिन दृश्य को स्पर्श नहीं करना चाहता हूं" – Raffaele

+0

क्या आप मुझे लिंक या कीवर्ड दे सकते हैं? – Leo

1

DrawView क्लास में सार्वजनिक चर के रूप में कैनवास 2 घोषित करने का प्रयास करें।

+0

समस्या केवल कैनवास कॉल में है। – Leo

0

आप onDraw() में अपनी मंडलियों आकर्षित। इस तरह View काम करना चाहिए (तकनीकी रूप से यह वास्तव में draw() विधि में है लेकिन हम इसे अनदेखा करेंगे)। setPoints() में, वर्ग स्कोप के भीतर चर के सर्कल के बिंदु सेट करें, invalidate() पर कॉल करें, फिर onDraw() में उस सर्कल को खींचें। यदि आप इस विधि का पालन करते हैं, तो आप कक्षा प्रवाह का पालन कर रहे हैं जिसे दृश्य के लिए डिज़ाइन किया गया था।

+0

हम्म .. सार्वजनिक शून्य सेट पॉइंट्स (फ्लोट एक्सपी, फ्लोट वाईपी) { कैनवास 2.drawCircle (xP, yP, 5, paint); अमान्य(); } तो? – Leo

+0

नहीं 'कैनवास 2.drawCircle (एक्सपी, वाईपी, 5, पेंट); '' ड्रा '()' में चला जाता है। आप 'xP', 'yP' के मानों को सहेजते हैं, फिर' setPoints() ' – DeeV

+0

में' अमान्य()' को कॉल करें, कृपया अपडेट कोड देखें, कृपया – Leo

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