Dibujar un rectángulo con un gesto de movimiento

Estoy tratando de crear un rectángulo, pero esto es lo que sucede cuando me muevo desde coordenadas de inicio hacia las coordenadas finales

Es lo que pasa

, En realidad quiero mostrar el progreso cuando el usuario se mueve de un punto a otro también. Esto es lo que me gustaría tener. me gustaría tener .

Código:-

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

Editar Lo que me gustaría hacer es mostrar el progreso, es decir, como el usuario se mueve el dedo, la forma debe ser dibujado.

Sugerencias / Muestras / enlaces cualquier cosa será apreciada.

Está actualizando directamente el lienzo en el evento onTouch() sin onTouch() primero. Esta no es la forma supuesta de dibujar algo en una vista (suponiendo que esto es lo que quieres).

En su lugar se supone que debe almacenar las coordenadas onDraw() y actuales del rectángulo y utilizarlas en el evento onDraw() para dibujar el rectángulo real (después de que Adnroid eliminó la parte invalidada del lienzo para usted). Android publicará este evento si el lienzo debe volver a dibujarse, por lo que debe indicar que esto es necesario en el evento onTouch() mediante el método 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); } } } 

¿Limpia el lienzo entre dos rectángulos? Añadir una función como ésta:

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

Lo siento querido le doy toda la bruja de la actividad que utilizo y dibujo rect en la lona.

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

En este BibleHelper es el uso de la bruja de la clase del ayudante para la exhibición un cierto mensaje y registro.

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

Este código lo está causando. Porque estás creando muchos rectángulos aquí. En lugar de ello, en onDraw(Canvas canvas) tiene drawRect método y uso invalidate en todos los eventos. Espero que esto ayude.

Si entiendo que usted corrige que desea que el usuario dibuje el rectángulo en la pantalla y lo dibujaría en la pantalla.

Creo que sólo se puede pintar un punto donde el usuario pulsa, sólo para dar una retroalimentación al usuario, y cuando termina de dibujar sustituir por el rectángulo

O dibuja las líneas del rectángulo, por lo que el usuario comienza a dibujar y tiene una línea desde el principio a su dedo, cuando el usuario cambia de dirección, comienza una nueva línea desde donde el usuario cambió de dirección y el dedo, luego cuando el usuario regresa al inicio Usted tiene un rectángulo dibujar como 4 líneas

  • ¿Estoy invalidando toda la pantalla en cada llamada?
  • Cómo dibujar la forma de triángulo y añadirlo en la distribución relativa o lineal de android
  • ¿Cómo animar gradiente?
  • Android: ¿Cómo usar el método onDraw en una clase que extiende Actividad?
  • View.onDraw () - ¿cuándo se llama?
  • El método ImageView: onDraw dibuja "detrás" del fondo de la imagen, no en la parte superior
  • Tratando de obtener el tamaño de visualización de una imagen en un ImageView
  • Dibujo sobre lienzo fuera del método onDraw ()
  • OnDraw Vista personalizada dentro de un Scrollview
  • Vista personalizada de Android Vuelta de memoria de mapa de bits
  • Android - Dibujo de un laberinto de lienzo con el movimiento de caracteres suave
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.