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
- drawBitmap no es de pantalla completa
- Cómo definir una altura independiente de píxeles en un método onDraw ()
- PorterduffXfermode: borra una sección de un mapa de bits
- ¿Cómo establecer el tamaño de la lona?
- Android onDraw () ejecutándose en todas las vistas?
, 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. .
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.
- Android - calcular el ángulo del arco
- Cómo dibujar Arco entre dos puntos en el lienzo?
- Dibujar superposición (HUD) en Android VideoView?
- Cómo dibujar en un lienzo de vista sin upscaling artefactos cuando el padre de vista tiene un factor de escala?
- Limpiar el lienzo con Canvas.drawColor ()
- Lona de Android - Dibuja un agujero
- Widget personalizado utilizando LinearLayout no obtener onDraw ()
- Dibujo 2D eficiente en Android
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
- Copiar contenido de mapa de bits de un ImageView a otro
- ¿Detectar si url especificada es una imagen en Android?