2012-12-13 40 views
9

पर आकर्षित करने के लिए कैसे मैं अपने स्वयं के दृश्य (R.id.view) पर पेंट करने की कोशिश कर रहा हूं लेकिन इस कोड का कोई प्रभाव नहीं प्रतीत होता है। यह मुझे कुछ भी आकर्षित करने की इजाजत नहीं दे रहा है।एंड्रॉइड -

public class MainActivity extends Activity implements OnTouchListener 
     { 
Path mPath; 
Canvas canvas; 
Paint mPaint; 
MaskFilter mEmboss; 

    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     View view=(View)findViewById(R.id.view1); 
     mPaint = new Paint(); 
     mPaint.setAntiAlias(true); 
     mPaint.setDither(true); 
     mPaint.setColor(0xFFFF0000); 
     mPaint.setStyle(Paint.Style.STROKE); 
     mPaint.setStrokeJoin(Paint.Join.ROUND); 
     mPaint.setStrokeCap(Paint.Cap.ROUND); 
     mPaint.setStrokeWidth(12); 

     canvas = null; 
     //view.draw(canvas); 
     mPath = new Path(); 
     Bitmap mBitmap; 
     //Paint mBitmapPaint = new Paint(Paint.DITHER_FLAG); 
     mBitmap = Bitmap.createBitmap(210, 170, Bitmap.Config.ARGB_8888); 
     canvas = new Canvas(mBitmap); 
     canvas.drawColor(0xFFAAAAAA); 

     canvas.drawBitmap(mBitmap, 0, 0, mPaint); 


     //canvas.drawPaint(mPaint); 
     view.draw(canvas); 
     canvas.drawPath(mPath, mPaint); 


     mEmboss = new EmbossMaskFilter(new float[] { 1, 1, 1 }, 
             0.4f, 6, 3.5f); 



     view.setOnTouchListener(new OnTouchListener() { 

      public boolean onTouch(View v, MotionEvent event) { 
       float x = event.getX(); 
       float y = event.getY(); 
       Log.d("x", String.valueOf(x)); 
       Log.d("y", String.valueOf(y)); 

       switch (event.getAction()) { 
        case MotionEvent.ACTION_DOWN: 
         Log.d("a","down"); 
         touch_start(x, y); 
         //invalidate(); 
         break; 
        case MotionEvent.ACTION_MOVE: 
         touch_move(x, y); 
         // invalidate(); 
         break; 
        case MotionEvent.ACTION_UP: 
         touch_up(); 
         // invalidate(); 
         break; 
       } 
       return true; 
      } 
     }); 

     // mBlur = new BlurMaskFilter(8, BlurMaskFilter.Blur.NORMAL); 
    } 
    private float mX, mY; 
    private static final float TOUCH_TOLERANCE = 4; 

    private void touch_start(float x, float y) { 
     mPath.reset(); 
     mPath.moveTo(x, y); 
     mX = x; 
     mY = y; 
    } 
    private void touch_move(float x, float y) { 
     float dx = Math.abs(x - mX); 
     float dy = Math.abs(y - mY); 
     if (dx >= TOUCH_TOLERANCE || dy >= TOUCH_TOLERANCE) { 
      mPath.quadTo(mX, mY, (x + mX)/2, (y + mY)/2); 
      mX = x; 
      mY = y; 
     } 
    } 
    private void touch_up() { 
     mPath.lineTo(mX, mY); 
     // commit the path to our offscreen 
     canvas.drawPath(mPath, mPaint); 
     // kill this so we don't double draw 
     mPath.reset(); 
    } 





} 

मैं अपने स्वयं के दृश्य पर फ्रीहानफ उंगली पेंट का उपयोग करने के लिए क्या करूँ?

+0

** मेरा उत्तर देखें [यहां क्लिक करें] (http://stackoverflow.com/a/41135685/4629101) ** –

उत्तर

6

यह सर्वोत्तम होगा यदि आपने कक्षा को विस्तारित किया है, और इसे सामग्री दृश्य में सेट किया है, तो यह और अधिक गतिशील है। एक्शन_Move पैरामीटर को टच इवेंट्स के दौरान बहुत कुछ कहा जाता है, इसलिए इसे ध्यान में रखना सबसे अच्छा हो सकता है, अन्यथा जब आप वक्र चाहते थे तो आपको सीधी रेखा मिल जाएगी।

संपादित:
आप
View view = new MyView();
setContentView(view);

अपने MyView वर्ग के अंदर बदलकर onCreate में शुरू होगा आप 'पथ' वस्तुओं की एक ArrayList है, हर Action_UP कहा जाता हो जाता है , आप सरणी सूची में पथ जोड़ते हैं, view.Invalidate(); का उपयोग करें और फिर कक्षा आपके व्यू क्लास में ऑन ड्रा विधि को कॉल करेगी। तो आप इसे इस तरह ओवरराइड करते हैं।

@Override public void onDraw(Canvas c){
for(Path p: listOfPaths){
c.drawPath(p, paint);}
}

नोट: यह सरल ड्राइंग के लिए अच्छा होगा, वहाँ कई लाइनें हैं एक बार के बाद से आपके टेबलेट या इस विधि के साथ फोन पर मोना लिसा आकर्षित करने के लिए की उम्मीद नहीं है आप एक अंतराल नोटिस हो सकता है। यदि आप अधिक जटिल और पेशेवर प्राप्त करना चाहते हैं। view.Invalidate(Rect r) दृष्टिकोण देखें, जो पूरे दृश्य को अमान्य नहीं करेगा, लेकिन केवल उस हिस्से को आपने

+0

किसी भी वर्ग जो दृश्य को विस्तारित करता है, उस पर एक विधि विधि होगी। बस अपने एक्शन_अप के दौरान अमान्य कॉल करें, और यह ऑन ड्रा विधि को कॉल करेगा। अद्यतन दृश्य को फिर से निकालने के लिए। उम्मीद है कि यह मदद की। – dannyRods

+0

क्या हमें और जानकारी मिल सकती है? आप इसे अपने कोड में कैसे करेंगे? –

+1

आशा है कि इसे – dannyRods