2012-12-21 13 views
7

मैं एक आयत बनाने के लिए कोशिश कर रहा हूँ का उपयोग कर एक आयत आकर्षित है, लेकिन इस जब मैं अंत में निर्देशांक प्रारंभ होने से ले जाने के क्या होता है निर्देशांकएक कदम इशारा

is what happens

है, वास्तव में मैं प्रगति दिखाने के लिए चाहते हैं जब उपयोगकर्ता एक बिंदु से दूसरी तरफ जाता है। यही वह है जो मैं चाहता हूं। I would like to have

कोड: -

public boolean onTouch(View v, MotionEvent event) { 

    int action = event.getAction(); 
    switch (action) { 
    case MotionEvent.ACTION_DOWN: 
     downx = event.getX(); 
     downy = event.getY(); 

    //v.invalidate(); 
     break; 
    case MotionEvent.ACTION_MOVE: 
     upx = event.getX(); 
     upy = event.getY(); 

     canvas.drawRect(downx, downy, upx, upy, paint); 

     } 
     choosenImageView.invalidate(); 
     break; 
    case MotionEvent.ACTION_UP: 
     upx = event.getX(); 
     upy = event.getY(); 
      canvas.drawRect(downx, downy, upx, upy, paint); 
      } 
     } 

     // v.invalidate(); 
     break; 
    } 
    return true; 
} 

संपादित मुझे क्या करना चाहते हैं प्रगति अर्थात के रूप में उपयोगकर्ता अपनी उंगली चलता है, आकार तैयार किया जाना चाहिए दिखाने के लिए है।

सुझाव/नमूने/लिंक कुछ भी सराहना की जाएगी।

+0

पेंट सेट करें। स्टाइल भरने के लिए – BLOB

+0

मैं नहीं चाहता कि आयत पूरी तरह से भर जाए। –

+0

यह आयताकार के अंदर के हिस्से को भर देगा और बहु ​​आयताकार ड्राइंग समस्या को रोक देगा ... यहां [लिंक] है (http://developer.android.com/reference/android/graphics/Paint.Style.html) .. मुझे याद नहीं है कि किस का उपयोग करना है .. या तो भरें या FILL_AND_STROKE – BLOB

उत्तर

2
case MotionEvent.ACTION_MOVE: 
    upx = event.getX(); 
    upy = event.getY(); 

    canvas.drawRect(downx, downy, upx, upy, paint); 

    } 
    choosenImageView.invalidate(); 
break; 

यह कोड यह कारण है। क्योंकि आप यहां कई आयताकार बना रहे हैं। इसके बजाय, onDraw(Canvas canvas) में drawRect विधि है और सभी घटनाओं पर अमान्य उपयोग करें। उम्मीद है की यह मदद करेगा।

9

आप पहले इसे साफ़ किए बिना onTouch() ईवेंट में कैनवास अपडेट कर रहे हैं। यह किसी दृश्य में कुछ खींचने का अनुमानित तरीका नहीं है (मान लीजिए कि यह वही है जो आप चाहते हैं)।

इसके बजाय आपको आयताकार के प्रारंभ और वर्तमान निर्देशांक को स्टोर करना होगा और वास्तविक आयत खींचने के लिए onDraw() ईवेंट में उनका उपयोग करना होगा (एड्रॉइड ने आपके लिए कैनवास के अमान्य हिस्से को मंजूरी दे दी है)। कैनवास दोबारा बनाई जाना आवश्यक है या एंड्रॉयड इस घटना जारी करेगा, ताकि आप, यह बताने के लिए है कि इस onTouch() घटना में आवश्यक है की जरूरत है invalidate() विधि का उपयोग कर:

class myView extends View { // or some other View-based class 
    boolean drawRectangle = false; 
    PointF beginCoordinate; 
    PointF endCoordinate; 

    public boolean onTouch(View v, MotionEvent event) { 
     switch(event.getAction()) { 
     case MotionEvent.ACTION_DOWN: 
      drawRectangle = true; // Start drawing the rectangle 
      beginCoordinate.x = event.getX(); 
      beginCoordinate.y = event.getY(); 
      endCoordinate.x = event.getX(); 
      endCoordinate.y = event.getY(); 
      invalidate(); // Tell View that the canvas needs to be redrawn 
      break; 
     case MotionEvent.ACTION_MOVE: 
      endCoordinate.x = event.getX(); 
      endCoordinate.y = event.getY(); 
      invalidate(); // Tell View that the canvas needs to be redrawn 
      break; 
     case MotionEvent.ACTION_UP: 
      // Do something with the beginCoordinate and endCoordinate, like creating the 'final' object 
      drawRectangle = false; // Stop drawing the rectangle 
      invalidate(); // Tell View that the canvas needs to be redrawn 
      break; 
     } 
    } 

    protected void onDraw(Canvas canvas) { 
     if(drawRectangle) { 
     // Note: I assume you have the paint object defined in your class 
     canvas.drawRect(beginCoordinate.x, beginCoordinate.y, endCoordinate.x, endCoordinate.y, paint); 
     } 
    } 
} 
6

आप दो आयत के बीच कैनवास को साफ करते हैं? इस तरह एक समारोह में जोड़ें:

void clearCanvas() 
    { 
    canvas.drawRect(0,0, width, height, paint); 

    } 
2

अगर मैं तुम्हें सही कर आप उपयोगकर्ता स्क्रीन पर आयत बनाने के लिए चाहते हैं समझते हैं और आप तो प्रदर्शन पर यह ड्रा करेंगी।

मुझे लगता है कि तुम सिर्फ एक बिंदु पेंट कर सकते हैं जहां उपयोगकर्ता प्रेस, बस उपयोगकर्ता के लिए एक प्रतिक्रिया देने के लिए, और जब वह आप आयत

या आयत की रेखा खींचने से स्थानापन्न ड्राइंग समाप्त कर ले, तो उपयोगकर्ता ड्राइंग शुरू होता है और आपके पास शुरुआत से लेकर उसकी उंगली तक एक रेखा होती है, जब उपयोगकर्ता दिशा बदलता है तो आप एक नई लाइन शुरू करते हैं जहां से उपयोगकर्ता ने दिशा और उंगली बदल दी, फिर जब उपयोगकर्ता शुरू करने के लिए लौटता है तो आपके पास आयताकार ड्रा 4 लाइन

के रूप में होता है
3

क्षमा करें प्रिय मैं आपको पूरे गतिविधि चुड़ैल देता हूं जिसका उपयोग मैं कैनवास पर करता हूं और रेक्ट करता हूं।

public class CanvasExample extends Activity 
    { 
     /** Called when the activity is first created. */ 

     RelativeLayout relMainOperationLayout; 
     RelativeLayout relTabHeader; 
     //RelativeLayout relMidalLayout; 
     RelativeLayout relBelowLayout; 
     Context myContext; 
     DrawCanvas drawCanvas; 
     static boolean loadFlage=true; 
     BibleHelper bibleHelper; 

     Bitmap mainBitmap; 




     @Override 
     public void onCreate(Bundle savedInstanceState) 
     { 
      super.onCreate(savedInstanceState); 
      myContext=CanvasExample.this; 
      bibleHelper=new BibleHelper(CanvasExample.this,myContext); 
      bibleHelper.setFullScreen(); 

      LayoutInflater layoutInflater=(LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

      int layoutId = myContext.getResources().getIdentifier("main","layout",getPackageName()); 

      relMainOperationLayout = (RelativeLayout) layoutInflater.inflate(layoutId,null); 

      relTabHeader=(RelativeLayout) relMainOperationLayout.findViewById(R.id.relHeadLayout); 

      //relMidalLayout=(RelativeLayout) relMainOperationLayout.findViewById(R.id.relmidalLayout); 

      relBelowLayout=(RelativeLayout) relMainOperationLayout.findViewById(R.id.relBelowLayout); 



      mainBitmap=getIconDrawable(R.drawable.splash); 


      drawCanvas=new DrawCanvas(CanvasExample.this,myContext); 

      //drawCanvas.setBackgroundColor(Color.YELLOW); 

      //drawCanvas.setBackgroundDrawable(CanvasExample.this.getResources().getDrawable(R.drawable.splash)); 

      drawCanvas.setBackgroundDrawable(new BitmapDrawable(mainBitmap)); 



      RelativeLayout.LayoutParams drawParams=new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT); 

      drawParams.addRule(RelativeLayout.BELOW, relTabHeader.getId()); 

      //relMidalLayout.addView(drawCanvas,drawParams); 

      relMainOperationLayout.addView(drawCanvas,drawParams); 


//   mainImageView=new ImageView(CanvasExample.this); 
//   
//   RelativeLayout.LayoutParams mainParams=new RelativeLayout.LayoutParams(LayoutParams.FILL_PARENT,200); 
//   relMainOperationLayout.addView(mainImageView,mainParams); 
//   mainImageView.setBackgroundDrawable(CanvasExample.this.getResources().getDrawable(R.drawable.ic_launcher)); 





      setContentView(relMainOperationLayout); 



     } 




     class DrawCanvas extends View 
     { 

      Context drawContext; 
      Activity drawActivity; 
      ImageView image; 
      Paint mPaint; 
      int left=0,right=0,top=0,bottom=0; 
      Canvas passCanvas; 

      //Bitmap bitmapOrg; 
      // bitmapOrg; 

      public DrawCanvas(Activity activity,Context context) 
      { 
       super(activity); 

       this.drawActivity=activity; 

       this.drawContext=context; 

       //bitmapOrg = BitmapFactory.decodeResource(getResources(),R.drawable.splash); 

        mPaint = new Paint(); 

        mPaint.setDither(true); 

        mPaint.setColor(Color.RED); 

        mPaint.setStyle(Paint.Style.STROKE); 

        mPaint.setStrokeJoin(Paint.Join.ROUND); 

        mPaint.setStrokeCap(Paint.Cap.ROUND); 

        mPaint.setStrokeWidth(3); 

        mPaint.setFilterBitmap(true); 

       this.setOnTouchListener(new View.OnTouchListener() { 

        //@Override 
        public boolean onTouch(View v, MotionEvent event) 
        { 

         switch (event.getActionMasked()) 
         { 
         case MotionEvent.ACTION_DOWN: 

          invalidate(); 

          left=(int) event.getX(); 
          right=left+1; 
          top=(int) event.getY(); 
          bottom=top+1;    
          mPaint.setColor(Color.BLACK); 
          onDraw(passCanvas=new Canvas()); 
         break; 

         case MotionEvent.ACTION_MOVE:     
          invalidate(); 
          int tempX=(int) event.getX(); 

          //System.err.println("Get X->"+event.getX()); 
          if(tempX>right) 
          { 
           right=right+1; 
          } 
          else 
          { 
           right=right-1; 

          } 
          //System.err.println("Get Y->"+event.getY()); 
          int tempY=(int) event.getY(); 

          if(tempY>bottom) 
          { 
           bottom=bottom+1;     

          }else 
          { 
           bottom=bottom-1;     

          } 

          mPaint.setColor(Color.GREEN); 
          onDraw(passCanvas=new Canvas()); 
         break; 

         case MotionEvent.ACTION_UP: 
          invalidate(); 
          mPaint.setColor(Color.RED); 
          onDraw(passCanvas=new Canvas()); 
          System.err.println("After Touch Up"); 
          CanvasExample.loadFlage=false; 
          onDraw(passCanvas=new Canvas()); 


          /* 
          bibleHelper.showErrorLog("Start X -->"+left); 

          bibleHelper.showErrorLog("Real X -->"+event.getX()); 

          bibleHelper.showErrorLog("End X-->"+right); 

          bibleHelper.showErrorLog("Start Y-->"+top); 

          bibleHelper.showErrorLog("Real Y-->"+top); 


          bibleHelper.showErrorLog("End Y-->"+bottom); 
          */ 

          Bitmap croppedBmp = Bitmap.createBitmap(mainBitmap,left,top,right,bottom); 


          final Dialog dialog = new Dialog(CanvasExample.this); 

          dialog.setContentView(R.layout.custom_dialog); 
          dialog.setTitle("Title..."); 
          dialog.setCancelable(true); 

          ImageView image = (ImageView) dialog.findViewById(R.id.main); 
          image.setImageBitmap(croppedBmp); 
          Button btnClose=(Button) dialog.findViewById(R.id.btnClose); 

          btnClose.setOnClickListener(new View.OnClickListener() 
          { 

           public void onClick(View v) 
           { 
            dialog.dismiss(); 
           } 
          }); 

          dialog.show(); 

         break; 

         default: 

          break; 
         } 
         return true; 
        } 
       });  

      } 

      @Override 
      protected void onDraw(Canvas canvas) 
      { 

       canvas.drawRect(left, top, right, bottom, mPaint); 
      } 

     } 
     private Bitmap getIconDrawable(int imageId) 
     { 
      //Drawable rtnDrawable = null; 
      Bitmap imageBitmap=null; 
      try 
      { 
       int getImageWH[]; 
       imageBitmap = BitmapFactory.decodeResource(getResources(),imageId); 
       int IW = imageBitmap.getWidth(); 
       int IH = imageBitmap.getHeight(); 

       bibleHelper.showErrorLog("Icon Width->" + IW); 
       bibleHelper.showErrorLog("Icon Height->" + IH); 

       WindowManager winManager = (WindowManager) CanvasExample.this.getSystemService(Context.WINDOW_SERVICE); 
       int screenwidth = winManager.getDefaultDisplay().getWidth(); 
       int screenheight = winManager.getDefaultDisplay().getHeight(); 

       getImageWH = bibleHelper.getObjectWidthHeight(screenwidth,screenheight, IW, IH); 

       bibleHelper.showErrorLog("Get Icon Width->" + getImageWH[0]); 
       bibleHelper.showErrorLog("Get Icon Height->" + getImageWH[1]); 

       imageBitmap = Bitmap.createScaledBitmap(imageBitmap, getImageWH[0],getImageWH[1], false); 

       bibleHelper.showErrorLog("New Width-->"+imageBitmap.getWidth()); 
       bibleHelper.showErrorLog("New Height-->"+imageBitmap.getHeight()); 

       //rtnDrawable = (Drawable) new BitmapDrawable(imageBitmap); 
      } catch (Exception ex) { 
       bibleHelper.showErrorLog("Convert Icon Exception-->"+ ex.toString()); 
      } 
      //return rtnDrawable; 
      return imageBitmap; 
     } 


} 

इस बाइबल में हेल्पर कुछ संदेश और लॉग प्रदर्शित करने के लिए सहायक वर्ग चुड़ैल का उपयोग है।

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