Dessiner un rectangle en utilisant un geste de mouvement

J'essaie de créer un rectangle, mais c'est ce qui se passe lorsque je me déplace des coordonnées de départ vers les coordonnées finales

C'est ce qui se passe

  • Comment remplir un chemin d'accès en Android avec un dégradé linéaire?
  • Explication d'Android Xfermode
  • Android drawBitmap 5x différence de performance
  • Comment puis-je dessiner une courbe à travers des points d'arbre dans Android?
  • Comment dessiner le texte en italique sur la toile Android?
  • Comment blit () dans Android?
  • , En fait, je veux montrer la progression lorsque l'utilisateur passe d'un point à l'autre aussi. C'est ce que j'aimerais avoir. je voudrais avoir .

    Code:-

    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; } 

    Modifier Ce que j'aimerais faire, c'est montrer les progrès, c'est-à-dire que l'utilisateur déplace son doigt, la forme doit être dessinée.

    Suggestions / Exemples / liens tout sera apprécié.

  • Comment puis-je placer des limites sur la matrice de traduction de ma toile?
  • Obtenir des coordonnées de Canvas après la mise à niveau vers le haut / vers le bas ou le glisser vers l'Android
  • Image en toile avec des événements tactiles
  • Comment dessiner le texte en italique sur la toile Android?
  • 5 Solutions collect form web for “Dessiner un rectangle en utilisant un geste de mouvement”

    Vous onTouch() directement à jour la toile dans l' onTouch() sans l'effacer avant. Ce n'est pas la façon supposée de dessiner quelque chose dans une vue (en supposant que c'est ce que vous voulez).

    Au lieu de cela, vous êtes censé stocker les coordonnées de début et de temps du rectangle et les utiliser dans l' onDraw() pour dessiner le rectangle réel (après que Adnroid a effacé la partie invalide du Canvas pour vous). Android émettra cet événement si le canevas doit être redessiné, donc vous devez indiquer que cela est requis dans l' onTouch() , en utilisant la méthode 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); } } } 

    Nettoyez-vous la toile entre deux rectangles? Ajoutez une fonction comme celle-ci:

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

    Désolé Cher, je vous donne toute l'activité que j'utilise et dessins sur la toile.

     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; } } 

    Dans cette BibleHelper est Helper class witch use pour afficher un message et un journal.

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

    Ce code le provoque. Parce que vous créez de nombreux rectangles ici. Au lieu de cela, dans onDraw(Canvas canvas) méthode drawRect et l'utilisation invalident sur tous les événements. J'espère que cela t'aides.

    Si je comprends que vous corrigez, vous voulez que l'utilisateur dessine le rectangle sur l'écran et que vous le dessinez ensuite sur l'écran.

    Je pense que vous pourriez simplement peindre un point où l'utilisateur appuie, juste pour donner un commentaire à l'utilisateur, et quand il finit de vous dessiner, vous substituez par le rectangle

    Ou dessinez les lignes du rectangle, donc l'utilisateur commence à dessiner et vous avez une ligne entre le début et le doigt, lorsque l'utilisateur change de direction, vous commencez une nouvelle ligne à partir de laquelle l'utilisateur a changé de direction et le doigt, puis lorsque l'utilisateur retourne pour démarrer Vous avez un dessin rectangle en 4 lignes

    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.