bitmap como - Android:gira la imagen en la vista de la imagen desde un ángulo




samsung por (14)

Estoy usando el siguiente código para rotar una imagen en ImageView por un ángulo. ¿Hay algún método más simple y menos complejo disponible?

ImageView iv = (ImageView)findViewById(imageviewid);
TextView tv = (TextView)findViewById(txtViewsid);
Matrix mat = new Matrix();
Bitmap bMap = BitmapFactory.decodeResource(getResources(),imageid);
mat.postRotate(Integer.parseInt(degree));===>angle to be rotated
Bitmap bMapRotate = Bitmap.createBitmap(bMap, 0, 0,bMap.getWidth(),bMap.getHeight(), mat, true);
iv.setImageBitmap(bMapRotate);

Answers

sin matriz y animado:

{
    img_view = (ImageView) findViewById(R.id.imageView);
    rotate = new RotateAnimation(0 ,300);
    rotate.setDuration(500);
    img_view.startAnimation(rotate);
}

solo escriba esto en su onactivityResult

            Bitmap yourSelectedImage= BitmapFactory.decodeFile(filePath);
            Matrix mat = new Matrix();
            mat.postRotate((270)); //degree how much you rotate i rotate 270
            Bitmap bMapRotate=Bitmap.createBitmap(yourSelectedImage, 0,0,yourSelectedImage.getWidth(),yourSelectedImage.getHeight(), mat, true);
            image.setImageBitmap(bMapRotate);
            Drawable d=new BitmapDrawable(yourSelectedImage);
            image.setBackground(d); 

Otra forma simple de rotar un ImageView :
ACTUALIZAR:
Importaciones requeridas:

import android.graphics.Matrix;
import android.widget.ImageView;

Código: (Asumiendo que imageView , angle , pivotX y pivotY ya están definidos)

Matrix matrix = new Matrix();
imageView.setScaleType(ImageView.ScaleType.MATRIX);   //required
matrix.postRotate((float) angle, pivotX, pivotY);
imageView.setImageMatrix(matrix);

Este método no requiere la creación de un nuevo mapa de bits cada vez.

NOTA: Para rotar un ImageView en ontouch en tiempo de ejecución, puede configurar TouchTouchListener en ImageView y rotarlo agregando las dos últimas líneas (por ejemplo, matriz de postRotate y configurarlo en imageView ) en la sección de código anterior en su parte ACTION_MOVE de detector táctil .


Hay dos maneras de hacerlo:

1 Usando Matrix para crear un nuevo mapa de bits:

imageView = (ImageView) findViewById(R.id.imageView);
Bitmap myImg = BitmapFactory.decodeResource(getResources(), R.drawable.image);

Matrix matrix = new Matrix();
matrix.postRotate(30);

Bitmap rotated = Bitmap.createBitmap(myImg, 0, 0, myImg.getWidth(), myImg.getHeight(),
        matrix, true);

imageView.setImageBitmap(rotated);

2 use RotateAnimation en la View que desea Girar, y asegúrese de que la Animación se configure para fillAfter=true , duration=0 y fromDegrees=toDgrees

 <?xml version="1.0" encoding="utf-8"?>
<rotate
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:fromDegrees="45"
  android:toDegrees="45"
  android:pivotX="50%"
  android:pivotY="50%"
  android:duration="0"
  android:startOffset="0"
/>

e infle la animación en el código:

Animation rotation = AnimationUtils.loadAnimation(this, R.anim.rotation);
myView.startAnimation(rotation);

Esta es mi implementación de RotatableImageView . El uso es muy fácil: solo copie attrs.xml y RotatableImageView.java en su proyecto y agregue RotatableImageView a su diseño. Establezca el ángulo de rotación deseado con el ejemplo: parámetro de ángulo .

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:example="http://schemas.android.com/apk/res/com.example"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <com.example.views.RotatableImageView
        android:id="@+id/layout_example_image"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:adjustViewBounds="true"
        android:scaleType="fitCenter"
        android:src="@drawable/ic_layout_arrow"
        example:angle="180" />
</FrameLayout>

Si tiene problemas para mostrar la imagen, intente cambiar el código en el método RotatableImageView.onDraw () o use el método draw () en su lugar.


mImageView.setRotation(angle) con API> = 11


Otra posible solución es crear su propia vista de imagen personalizada (digamos que RotateableImageView extends ImageView ) ... y anular el onDraw () para rotar los lienzos / mapas de bits antes de releer al lienzo. No olvide restaurar el lienzo.

Pero si va a rotar solo una instancia de vista de imagen, su solución debería ser lo suficientemente buena.


Si solo desea rotar la vista visualmente, puede usar:

iv.setRotation(float)

Si admite API 11 o superior, puede usar el siguiente atributo XML:

android:rotation="90"

Es posible que no se muestre correctamente en la vista previa de Android Studio xml, pero funciona como se esperaba.


Aquí hay una buena solución para poner un drawable girado para un imageView:

Drawable getRotateDrawable(final Bitmap b, final float angle) {
    final BitmapDrawable drawable = new BitmapDrawable(getResources(), b) {
        @Override
        public void draw(final Canvas canvas) {
            canvas.save();
            canvas.rotate(angle, b.getWidth() / 2, b.getHeight() / 2);
            super.draw(canvas);
            canvas.restore();
        }
    };
    return drawable;
}

uso:

Bitmap b=...
float angle=...
final Drawable rotatedDrawable = getRotateDrawable(b,angle);
root.setImageDrawable(rotatedDrawable);

otra alternativa:

private Drawable getRotateDrawable(final Drawable d, final float angle) {
    final Drawable[] arD = { d };
    return new LayerDrawable(arD) {
        @Override
        public void draw(final Canvas canvas) {
            canvas.save();
            canvas.rotate(angle, d.getBounds().width() / 2, d.getBounds().height() / 2);
            super.draw(canvas);
            canvas.restore();
        }
    };
}

Además, si desea rotar el mapa de bits, pero le teme a OOM, puede usar una solución NDK que hice here


En lugar de convertir la imagen a mapa de bits y luego girarla, intente girar la vista de la imagen directa como el código siguiente.

ImageView myImageView = (ImageView)findViewById(R.id.my_imageview);

AnimationSet animSet = new AnimationSet(true);
animSet.setInterpolator(new DecelerateInterpolator());
animSet.setFillAfter(true);
animSet.setFillEnabled(true);

final RotateAnimation animRotate = new RotateAnimation(0.0f, -90.0f,
    RotateAnimation.RELATIVE_TO_SELF, 0.5f, 
    RotateAnimation.RELATIVE_TO_SELF, 0.5f);

animRotate.setDuration(1500);
animRotate.setFillAfter(true);
animSet.addAnimation(animRotate);

myImageView.startAnimation(animSet);

Tristemente, no creo que exista. La clase Matrix es responsable de todas las manipulaciones de la imagen, ya sea girando, encogiendo / creciendo, sesgando, etc.

http://developer.android.com/reference/android/graphics/Matrix.html

Mis disculpas, pero no puedo pensar en una alternativa. Tal vez alguien más pueda, pero las veces que he tenido que manipular una imagen he usado Matrix.

¡La mejor de las suertes!


Tengo una solution para esto. En realidad, es una solución a un problema que surge después de la rotación (la imagen rectangular no se ajusta a ImagView) pero también cubre su problema. Aunque esta solución tiene animación para bien o para mal

    int h,w;
    Boolean safe=true;

No es posible obtener los parámetros de imageView en la inicialización de la actividad. Para hacerlo, consulte esta solution O establezca las dimensiones en onClick of a Button Like this

    rotateButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            if(imageView.getRotation()/90%2==0){
                h=imageView.getHeight();
                w=imageView.getWidth();

            }
        .
        .//Insert the code Snippet below here 
       }

Y el código que se ejecutará cuando queremos rotar ImageView

if(safe)     
imageView.animate().rotationBy(90).scaleX(imageView.getRotation()/90%2==0?(w*1.0f/h):1).scaleY(imageView.getRotation()/90%2==0?(w*1.0f/h):1).setDuration(2000).setInterpolator(new LinearInterpolator()).setListener(new Animator.AnimatorListener() {
                @Override
                public void onAnimationStart(Animator animation) {
                      safe=false;
                }

                @Override
                public void onAnimationEnd(Animator animation) {
                      safe=true;

                }

                @Override
                public void onAnimationCancel(Animator animation) {

                }

                @Override
                public void onAnimationRepeat(Animator animation) {

                }
            }).start();
        }
    });

Esta solución es suficiente para el problema anterior. Aunque reducirá la imagen vista incluso si no es necesaria (cuando la altura es menor que el ancho). Si le molesta, puede agregar otro operador ternario dentro de scaleX / scaleY.


Para obtener instrucciones detalladas sobre cómo obtener un identificador único para cada dispositivo Android de su aplicación se instala desde, ver el oficial de Android Desarrolladores de Publicación android-developers.blogspot.com/2011/03/… .

Parece que la mejor manera es que usted mismo genere uno después de la instalación y luego lo lea cuando se reinicie la aplicación.

Personalmente me parece aceptable pero no ideal. Ningún identificador proporcionado por Android funciona en todos los casos, ya que la mayoría depende de los estados de radio del teléfono (Wi-Fi activado / activado, activación / desactivación celular, Bluetooth activado / desactivado). Los otros, como Settings.Secure.ANDROID_IDdebe ser implementado por el fabricante y no se garantiza que sean únicos.

El siguiente es un ejemplo de escritura de datos en un archivo de instalación que se almacenaría junto con cualquier otro dato que la aplicación guarde localmente.

public class Installation {
    private static String sID = null;
    private static final String INSTALLATION = "INSTALLATION";

    public synchronized static String id(Context context) {
        if (sID == null) {
            File installation = new File(context.getFilesDir(), INSTALLATION);
            try {
                if (!installation.exists())
                    writeInstallationFile(installation);
                sID = readInstallationFile(installation);
            } 
            catch (Exception e) {
                throw new RuntimeException(e);
            }
        }
        return sID;
    }

    private static String readInstallationFile(File installation) throws IOException {
        RandomAccessFile f = new RandomAccessFile(installation, "r");
        byte[] bytes = new byte[(int) f.length()];
        f.readFully(bytes);
        f.close();
        return new String(bytes);
    }

    private static void writeInstallationFile(File installation) throws IOException {
        FileOutputStream out = new FileOutputStream(installation);
        String id = UUID.randomUUID().toString();
        out.write(id.getBytes());
        out.close();
    }
}




android bitmap rotation imageview