Cómo dibujar una porción de mapa de bits a través de lienzo DrawBitmap

Yo tengo un
Condición de origen :

  1. FrameLayout (marcado con rojo)
  2. Fuente ImageView (negro)
  3. Objeto (vista de imagen) con OnTouchListener (naranja)

A través de Object con OnTouchListener, quiero mostrar una porción de mapa de bits, que se rellenan en imageview ( imageview de origen ).

Así que no es un problema, estoy haciendo así:
Bitmap bt = Bitmap.createBitmap(sourceBitmap,event.getX(),event.getY(),250,250);

Donde :

  1. SourceBitmap – es una imagen que se agrega a la fuente ImageView
  2. Event.getX () / event.getY () es una coord, donde empiezo a dibujar la parte del mapa de bits
  3. 250 , 250 – es un tamaño de porción de mapa de bits (parte).

Y el resultado es:

Resultado del primer caso

Así que los problemas se producen, cuando mi objeto (con touchlistener), ir a la frontera (he hecho esta posibilidad para el objeto naranja , para salir de la frontera con Object.width () / 2).

Así que en este caso:
Caso # 2
Cómo puedo lograr este resultado:
Excepto el resultado del caso # 2
Donde el resultado de la porción será:

  1. Parte del mapa de bits
  2. La segunda parte es el color del fondo framelayout.

Lo que intenté en el momento actual:

 public boolean onTouch(View view, MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_MOVE: //i want to draw bigger portion then corrds int CurrentX = (int)view.getX() - (view.getWidth()); int CurrentY = (int)view.getY() - (view.getHeight()); //case,when object is going out of border if(CurrentX <= 0) { Paint paint = new Paint(); paint.setStyle( Style.FILL ); paint.setColor( Color.RED ); mBitmap = Bitmap.CreateBitmap(sourceBitmap,(int)view.getX() + Math.abs(CurrentX),(int)view.getY(),250,250); Canvas canvas = new Canvas(mBitmap); canvas.drawBitmap(mBitmap,new Rect((int)view.getX()+Math.abs(CurrentX), (int)view.getY(),250-Math.abs(CurrentX),250),new RectF(Math.abs(CurrentX), 0, 250,250),paint); } break; } return true; } } 

¿Alguna sugerencia? ¡Gracias!

2 Solutions collect form web for “Cómo dibujar una porción de mapa de bits a través de lienzo DrawBitmap”

Resuelto por mí mismo !
Fue complicado , pero el resultado es bastante agradable.
Aquí vamos:
Así que para mi caso (cuando el objeto con OnTouchListener puede salir de la frontera en los ejes X e Y), he hecho post condiciones (algún tipo de regulaciones ).


Condiciones

Width = Ancho de imageView , donde quiero mostrar el resultado.
Height = Altura de imageView , donde quiero mostrar el resultado;

Lado izquierdo

  1. X_Coord < 0 && Y_CoordAltura / 2 <0 && Y_Coord < Bitmap.Height
    Esta es nuestra zona superior .
  2. X_Coord < 0 && Y_CoordAltura / 2 > 0 && Y_Coord < Bitmap.Height
    Esta es nuestra zona media .
  3. X_Coord < 0 && Y_CoordAltura / 2 > 0 && Y_Coord > Bitmap.Height
    Este es nuestro área inferior .

Lado derecho

  1. X_Coord > Bitmap.Height && Y_CoordAltura / 2 > 0 && Y_Coord < Bitmap.Height
    Esta es nuestra zona media .
  2. X_Coord > Bitmap.Height && Y_CoordAltura / 2 <0 && Y_Coord < Bitmap.Height
    Esta es nuestra zona superior .
  3. X_Coord > Bitmap.Height && Y_CoordAltura / 2 > 0 && Y_Coord > Bitmap.Height
    Este es nuestro área inferior .

Standart (Área de Medio, que no va a Izquierda oa Derecha)

  1. X_CoordWidth / 2 > 0 && X_Coord < Bitmap.Width && Y_CoordAltura / 2 <0 && Y_Coord < Bitmap.Height
    Esta es nuestra zona superior .
  2. X_CoordWidth / 2 > 0 && X_Coord < Bitmap.Width && Y_CoordAltura / 2 > 0 && Y_Coord > Bitmap.Height
    Este es nuestro área inferior .
  3. X_CoordWidth / 2 > 0 && X_Coord < Bitmap.Width && Y_CoordAltura / 2 > 0 && Y_Coord < Bitmap.Height
    Esta es nuestra zona media .

Así que a través de esta " Condiciones ", estoy dibujo parte de mapa de bits en mi caso MotionEvent.ACTION_MOVE .
Veamos algunos ejemplos:

 public boolean onTouch(View view, MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_MOVE: int Width = ResultImgView.getWidth(); int Height = ResultImgView.getHeight(); //paint for our Red background Paint paint = new Paint(); paint.setStyle( Style.FILL ); paint.setColor( Color.RED ); Bitmap mBitmap = null; Canvas canvas = null; //Our Condition if(view.getX() - Width / 2 >= SourceBitmap.getWidth() && view.getY() - Height / 2 > 0 && view.getY() + Height / 2 < SourceBitmap.getHeight()) { //Nice,we entered here. Seems that we're now located at RightSide at Middle position //So let's draw part of bitmap. //our margin for X coords int Difference = (int)((view.getX() - Width / 2 ) - SourceBitmap.getWidth(); //dont forget to put margin //BTW we're now took portion of bitmap mBitmap = Bitmap.createBitmap(SourceBitmap, ((int)view.getX() - Width / 2) - Difference, (int)view.getY() - Height / 2, Width,Height); canvas = new Canvas(mBitmap); //draw rect canvas.drawRect(0,0,mBitmap.getWidth(),mBitmap.getHeight(),paint); //draw portion of bitmap canvas.drawBitmap(mBitmap,new Rect(Difference, 0,mBitmap.getWidth(),mBitmap.getHeight()),new Rect(0,0,mBitmap.getWidth() - Difference,mBitmap.getHeight()),null); //and that's all! } //do the same for other condition....etc break; } return true; } 

¡Disfrutar!

PS Lo siento por mi eng :).

Si su sourceBitmap es sólo bitmap establecido en ImageView entonces el resultado es predecible. Para lograr su objetivo, necesita:

  1. Cuadrado naranja coordenadas en coordenadas de FrameLayout . Parece que ya tienes los correctos.
  2. Como sourceBitmap debes utilizar Bitmap creado por tu método FrameLayout.draw . Observe que su cuadrado naranja no debe ser FrameLayout's hijo FrameLayout's .

Si publicas todo tu código en algún lugar, lo puedo comprobar.

  • Evitar que el bitmap sea un android reciclado
  • Convertir un lienzo en imagen de mapa de bits en android
  • Recortar parte particular de la imagen en android
  • Borrar la pintura del lienzo sin borrar la imagen de fondo - Android
  • Herramienta para convertir en lotes bitmaps de recursos de Android a diferentes densidades
  • trabajar con imágenes grandes en android
  • Android, ayuda a girar la imagen en el tacto
  • UnsupportedException de Canvas.setBitmap (mapa de bits)
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.