Android: поворот изображения в режиме просмотра изображения под углом

Я использую следующий код для поворота изображения в ImageView под углом. Есть ли более простой и менее сложный метод.

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

Еще один простой способ повернуть ImageView :
ОБНОВИТЬ:
Требуемый импорт:

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

Код: (Предполагая, что imageView , angle , pivotX & pivotY уже определены)

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

Этот метод не требует создания нового растрового изображения каждый раз.

ПРИМЕЧАНИЕ. Чтобы повернуть ImageView в ontouch во время выполнения, вы можете установить onTouchListener на ImageView и повернуть его, добавив две последние строки (то есть матрицу postRotate и установите ее на imageView ) в разделе выше кода в части ACTION_MOVE вашего слушателя касания .

mImageView.setRotation(angle) с API> = 11

Если вы поддерживаете API 11 или выше, вы можете использовать только следующий атрибут XML:

 android:rotation="90" 

Он может отображаться неправильно в предварительном просмотре Android Studio xml, но он работает так, как ожидалось.

Это можно сделать двумя способами:

1 Использование Matrix для создания нового растрового изображения:

 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 используйте RotateAnimation в View вы хотите повернуть, и убедитесь, что анимация установлена ​​для fillAfter=true , duration=0 и fromDegrees=toDgrees

    

и Надуйте анимацию в коде:

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

Я знаю, что это безумно поздно, но это было полезно для меня, чтобы оно могло помочь другим.

Начиная с API 11, вы можете установить абсолютное rotation ImageView программно, используя imageView.setRotation(angleInDegrees); метод.

Абсолютно, я имею в виду, что вы можете многократно вызывать эту функцию, не отслеживая текущий поворот. Смысл, если я setRotation() пройдя 15F к setRotation() , а затем снова вызовите setRotation() с 30F , rotation изображения будет 30 gradleусов, а не 45 gradleусов.

Примечание. Это действительно работает для любого подclassа объекта View , а не только для ImageView.

Это моя реализация RotatableImageView . Использование очень просто: просто скопируйте attrs.xml и RotatableImageView.java в свой проект и добавьте RotatableImageView в свой макет. Установите желаемый угол поворота, используя пример: параметр угла .

    

Если у вас возникли проблемы с отображением изображения, попробуйте изменить код в методе RotatableImageView.onDraw () или используйте метод draw ().

попробуйте это на пользовательском представлении

 public class DrawView extends View { public DrawView(Context context,AttributeSet attributeSet){ super(context, attributeSet); } @Override public void onDraw(Canvas canvas) { /*Canvas c=new Canvas(BitmapFactory.decodeResource(getResources(), R.drawable.new_minute1) ); c.rotate(45);*/ canvas.drawBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.new_minute1), 0, 0, null); canvas.rotate(45); } } 

вот хорошее решение для размещения поворотного чертежа для изображения:

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

Применение:

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

другая альтернатива:

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

также, если вы хотите повернуть bitmap, но боитесь OOM, вы можете использовать решение NDK, которое я сделал здесь

просто напишите это в своем 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); 

У меня есть решение этого. На самом деле это решение проблемы, возникающей после вращения (прямоугольное изображение не соответствует ImagView), но оно также покрывает вашу проблему. Хотя это решение имеет анимацию лучше или хуже

  int h,w; Boolean safe=true; 

Получение параметров imageView невозможно при инициализации активности. Для этого обратитесь к этому решению или установите размеры на кнопке onClick.

  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 } 

И код, который нужно запустить, когда мы хотим повернуть 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(); } }); 

Это решение достаточно для проблемы выше. Хотя она будет уменьшать изображение, даже если это не обязательно (когда высота меньше ширины). Если это вас беспокоит, вы можете добавить еще один тернарный оператор внутри scaleX / scaleY.

К сожалению, я не думаю, что есть. Класс Matrix отвечает за все манипуляции с изображениями, независимо от того, он вращается, уменьшается / растет, перекос и т. Д.

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

Мои извинения, но я не могу придумать альтернативы. Может быть, кто-то еще сможет это сделать, но в то время, когда мне приходилось манипулировать изображением, я использовал Матрицу.

Удачи!

Еще одно возможное решение – создать собственный пользовательский вид изображения (скажем, RotateableImageView extends ImageView ) … и переопределить onDraw (), чтобы повернуть либо canvas / растровые изображения, прежде чем вставлять их на canvas. Не забудьте восстановить canvas обратно.

Но если вы собираетесь поворачивать только один экземпляр изображения, ваше решение должно быть достаточно хорошим.

без матрицы и анимации:

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

Попробуйте этот код 100% работать;

На кнопке поворота нажмите этот код:

  @Override public void onClick(View view) { if(bitmap==null){ Toast.makeText(getApplicationContext(), "Image photo is not yet set", Toast.LENGTH_LONG).show(); } else { Matrix matrix = new Matrix(); ivImageProduct.setScaleType(ImageView.ScaleType.MATRIX); //required matrix.postRotate(90,ivImageProduct.getDrawable().getBounds().width()/2,ivImageProduct.getDrawable().getBounds().height()/2); Bitmap bmp=Bitmap.createBitmap(bitmap, 0, 0,bitmap.getWidth(), bitmap.getHeight(), matrix, true); bitmap.recycle(); bitmap=bmp; ivImageProduct.setImageBitmap(bitmap); } } 

Если вы хотите визуально поворачивать визуально, вы можете использовать:

 iv.setRotation(float) 

Вместо того, чтобы преобразовывать изображение в bitmap, а затем поворачивать, попробуйте повернуть изображение прямого изображения, как показано ниже.

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

Следуйте приведенному ниже правилу для непрерывного вращения изображения.

 int i=0; 

Если нажата кнопка поворота

 imageView.setRotation(i+90); i=i+90; 

Я думаю, лучший способ 🙂

 int angle = 0; imageView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { angle = angle + 90; imageView.setRotation(angle); } }); 
  • Android: местоположение Google Maps с низким уровнем использования батареи
  • Неверный fragment в ViewPager получает onContextItemВыбранный вызов
  • Android - приемник SMS-вещания
  • Android Studio не может разрешить символ, но код выполняется правильно
  • Android Geocoder getFromLocationName всегда возвращает null
  • Динамически добавлять TableRow в TableLayout
  • RecyclerView вылетает, когда «утилизированные или прикрепленные виды не могут быть переработаны»
  • Как реализовать мою собственную схему URI на Android
  • Как отправить объект из одной активности Android в другой с помощью намерений?
  • Как рисовать маршрут в Google Maps API V2 из моего местоположения
  • как изменить изображения на изображении через некоторое время
  • Давайте будем гением компьютера.