Recortar y agrandar imagen sin mover la superposición Ver en cambio mover la imagen en ImageView
Hola quiero recortar la imagen sin mover la vista de superposición en lugar de mover la imagen.
La imagen se puede mover por todas partes. Me gustaría recortar y guardar el área resaltada como se muestra a continuación dentro del borde negro.
- Cómo usar el arrastrar correctamente de una vista en android
- Cómo dibujar línea en imageview junto con dedo en android
- ImageView ScaleType ignora el relleno
- ¿Cómo comprobar el tipo de un widget de vista?
- ViewPager onClickListener hace referencia a la vista errónea en android
Tengo ImageView
con android:scaleType="matrix"
Aquí está mi código de diseño
<RelativeLayout android:id="@+imageEdit/rl_ScaleImage" android:layout_width="match_parent" android:layout_height="fill_parent" android:layout_below="@+imageEdit/Topbar" android:visibility="visible" > <ImageView android:id="@+imageEdit/imageView1" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_alignParentLeft="true" android:scaleType="matrix" /> <View android:id="@+imageEdit/viewTop" android:layout_width="fill_parent" android:layout_height="50dp" android:layout_alignParentTop="true" android:background="#99000000" /> <View android:id="@+imageEdit/view_scaledImage" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_above="@+imageEdit/viewBottom" android:layout_below="@+imageEdit/viewTop" android:background="@drawable/rounded_corner_small" /> <View android:id="@+imageEdit/viewBottom" android:layout_width="fill_parent" android:layout_height="150dp" android:layout_alignParentBottom="true" android:background="#99000000" /> </RelativeLayout>
ImageView
tiene OnTouchListener
. La imagen se puede ampliar o alejar y también se puede mover en ImageView1
. View view_scaledImage
es el área que quiero recortar y guardar. ¿Cómo hago esto?
- añadir dinámicamente el diseño al método getview del adaptador en android
- Android ImageView Zoom-in y Zoom-out continuamente
- Aplicar colorMatrix colorFilter en parte de imageView con una máscara
- Imagen de estiramiento en la imagen para ajustar la pantalla en xml
- ¿Cómo puedo recortar un mapa de bits para ImageView?
- ¿Por qué no se encuentra la clase ImageView?
- Anchura máxima y altura para ImageView en Android
- Escucha de zoom para PhotoView
Finalmente conseguí la solución combinando la biblioteca de Cropper y las bibliotecas de PhotoView.
Puede utilizar la biblioteca de cropimage . Agregue esta línea a su archivo de manifiesto:
<activity android:name="eu.janmuller.android.simplecropimage.CropImage" />
Seleccione la imagen de la galería o cámara y llame a esta función:
public void runCropImage(String path) { Intent intent = new Intent(this, CropImage.class); intent.putExtra(CropImage.IMAGE_PATH, path); intent.putExtra(CropImage.SCALE, true); intent.putExtra(CropImage.ASPECT_X, 2);//change ration here via intent intent.putExtra(CropImage.ASPECT_Y, 2); startActivityForResult(intent, REQUEST_CODE_CROP_IMAGE);//final static int 1 }
Y en su onActivityResult
:
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { // TODO Auto-generated method stub super.onActivityResult(requestCode, resultCode, data); switch (requestCode) { // gallery and camera ommitted case REQUEST_CODE_CROP_IMAGE: String path = data.getStringExtra(CropImage.IMAGE_PATH); // if nothing received if (path == null) { return; } // cropped bitmap Bitmap bitmap = BitmapFactory.decodeFile(path); imageView.setImageBitmap(bitmap); break; default: break; } }
Esta biblioteca también tiene funcionalidad de zoom. Revise el ejemplo en el enlace que mencioné
De esta manera puede obtener las coordenadas de cualquier vista en relación con la ventana actual:
public Rect getViewPositionRelative(View v) { //Locate on screen int[] location = new int[2]; view.getLocationInWindow(location); //change to getLocationOnScreen(location) for an absolute positioning Rect rect = new Rect(); rect.left = location[0]; rect.top = location[1]; rect.right = rect.left + v.getWidth(); rect.bottom = rect.top + v.getHeight(); return rect; }
Utilizando este método, puede obtener el área tanto de ImageView como de la vista de superposición y, a continuación, calcular el área de recorte utilizando una base matemática;)
Es necesario combinar la biblioteca Cropper y PhotoView. He creado exactamente lo mismo para mi proyecto añadiendo la funcionalidad para seleccionar la imagen de la cámara o la galería. Compartir el código en Github. Se ha agregado un archivo apk en el proyecto. Utilice el dispositivo verdadero para probar la cámara pues el emulador no maneja bien la cámara. Aquí está el enlace a mi proyecto.
- Widget del selector de fecha y hora de la aplicación Buzón de correo
- Uso de ListView, quitar en adaptador siempre elimina el último elemento