Android: छवि को एक कोण से इमेजव्यू में घुमाएँ


154

मैं एक कोण द्वारा 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);

6
2014 के लिए PS, ऐसा लगता है कि आप Android स्टूडियो में बस XML में "रोटेशन" सेट कर सकते हैं। (आप केवल दाईं ओर "विशेषज्ञ गुण" बटन पर क्लिक कर सकते हैं, अगर आप 'पाठ' लेआउट का उपयोग करके परेशान नहीं हो सकते हैं!)
फेटी

जवाब यहीं मिलेगा। stackoverflow.com/a/52983423/5872337
गीत ठाकुर

जवाबों:


194

घुमाने का एक और सरल तरीका 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 हिस्सा।


109
पूर्णता के लिए यहां ImageView's मूल्यों पर आधारित रेखा है :matrix.postRotate( 180f, imageView.getDrawable().getBounds().width()/2, imageView.getDrawable().getBounds().height()/2);
स्टीफन होथ

2
कैसे हर स्पर्श घटना पर छवि को घुमाने के लिए?
सौरभ

14
मेरे लिए, यदि किसी रिश्तेदार में घुमाया गया हो, तो इमेज व्यू सम्‍मिलित छवि के आकार तक बढ़ता है, लेआउट में फिटिंग नहीं करता है। क्या किसी के पास इसका समाधान करने का अनुभव है?
मकीबो

7
नोट: काम करने के लिए इस के लिए, आप अपने सेट करने के लिए ImageViewकी srcविशेषता। getDrawable()मेरे लिए अशक्त लौट रहा था जब तक मुझे एहसास हुआ कि मैं स्थापित किया था ImageViewकी backgroundविशेषता के बजाय srcफेसपालम
गैरी एस।

1
यह इमेज को केवल इमेजव्यू में घुमाता है। छवि को घुमाने के लिए मुझे क्या करना चाहिए?
ईज

177

mImageView.setRotation(angle) एपीआई के साथ = = 11


3
क्या यह दृश्य की चौड़ाई और ऊंचाई को सही आकार में भी बदल देगा? या यह केवल यह कैसे दिखता है बदल जाता है?
Android डेवलपर

5
क्या घूर्णन करते समय "रोटेशन एनीमेशन" का एक तरीका है?
इवान मोर्गिलो

13
@IvanMorgillo आप पर एक नज़र डाल सकते हैं ViewPropertyAnimator, जिसका उपयोग किया जाता हैaView.animate().rotation(20).start()
जोकस्टर

5
@ इवान मॉर्गिलो: उपयोग करें rotationBy()। उदाहरण के लिए, view.animate().rotationBy(180f).start()। लेकिन यह समस्याग्रस्त हो जाता है यदि दृश्य क्रमिक रूप से क्लिक किया जाता है।
मंगेश

मैं एक बटन में इस कोड का उपयोग कर रहा हूं। पहला क्लिक ठीक है, लेकिन अगला क्लिक अब घूमता नहीं है। क्या मुझे इसे ठीक करने के लिए कोई दूसरी लाइन डालनी चाहिए?
एगाकिन बेकनवॉकर 20

73

यदि आप API 11 या उच्चतर का समर्थन कर रहे हैं, तो आप बस निम्नलिखित XML विशेषता का उपयोग कर सकते हैं:

android:rotation="90"

यह एंड्रॉइड स्टूडियो xml पूर्वावलोकन में सही ढंग से प्रदर्शित नहीं हो सकता है, लेकिन यह अपेक्षा के अनुरूप काम करता है।


3
एक्सएमएल पूर्वावलोकन के बारे में संकेत मुझे एक बहुत मदद की
ngu

रोटेशन लागू होने के बाद XML पूर्वावलोकन मेरे लिए ठीक से प्रदर्शित हो रहा है।
डिक लुकास

यह दृश्य को घुमाएगा लेकिन छवि को नहीं! यह छवि के बगल में रिक्त क्षेत्रों को जोड़ देगा। बस backgroundप्रभाव देखने के लिए एक जोड़ें ।
Yrrush

43

ऐसा करने के दो तरीके हैं:

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

 <?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"
/>

और कोड में एनीमेशन को फुलाएँ:

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

danx .. लेकिन डायनेमिक रूप से RotateAnimation करने के लिए dy ny तरीका है..मुझे d को गतिशील रूप से सेट करने का मतलब है ..
rijinrv

यह स्वीकृत उत्तर की तुलना में बेहतर काम करता है यदि आपको जिस छवि को घुमाने की आवश्यकता है वह एक सूची दृश्य में है
डैरन

9

मुझे पता है कि यह बहुत देर हो चुकी है, लेकिन यह मेरे लिए मददगार थी इसलिए यह दूसरों की मदद कर सकती है।

एपीआई 11 के रूप में, आप imageView.setRotation(angleInDegrees);विधि का उपयोग करके किसी छवि दृश्य के निरपेक्ष रोटेशन को प्रोग्रामेटिक रूप से सेट कर सकते हैं ।

निरपेक्ष से मेरा मतलब है कि आप इस फ़ंक्शन को वर्तमान घुमाव का ट्रैक रखने के बिना बार-बार कॉल कर सकते हैं। मतलब, अगर मैं पास करके बारी बारी से 15Fकरने के लिए setRotation()विधि, और फिर फोन setRotation()के साथ फिर से 30F30 डिग्री, 45 डिग्री नहीं हो साथ, छवि के घूर्णन।

नोट: यह वास्तव में ImageView ही नहीं, व्यू ऑब्जेक्ट के किसी भी उपवर्ग के लिए काम करता है ।


घूमने पर मेरी छवि पृष्ठ पर स्वाभाविक रूप से थोड़ी अधिक हो जाती है। मैं इसे कैसे सेट कर सकता हूं?
मैं

क्या आपकी छवि ठीक से केंद्रित है? यदि आपकी छवि में पारदर्शिता की असमान मात्रा है, तो रोटेशन के कारण स्थिति बदलने के लिए प्रकट होने का कारण बन सकता है
थोमसैप्सक

कोई आदमी नहीं, जब छवि घूमती है तो यह अक्ष का उपयोग करता है। अपने हाथ में ऊर्ध्वाधर स्थिति में अपने सेलफोन की कल्पना करें, अब इसे क्षैतिज घुमाएं। यह आपके हाथ को नहीं छूता है। तो वहाँ एक जगह है ... लेकिन मैंने इसे सेट किया है setPivotX () का उपयोग करके
मैं जानता हूँ कि

5

यह मेरा RotatableImageView का कार्यान्वयन है । उपयोग बहुत आसान है: बस अपनी परियोजना में attrs.xml और RotatableImageView.java की प्रतिलिपि बनाएँ और अपने लेआउट में RotatableImageView जोड़ें। उदाहरण का उपयोग करके वांछित रोटेशन कोण सेट करें : कोण पैरामीटर।

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

यदि आपको छवि प्रदर्शित करने में कुछ समस्याएँ हैं, तो बदले में RotatableImageView.onDraw () विधि या उपयोग ड्रा () पद्धति में कोड बदलने का प्रयास करें।


1
बहुत मददगार। साझा करने के लिए धन्यवाद!
स्टीफन होथ

RotatableImageView का उपयोग करते हुए मुझे NullPointerException मिली। संरक्षित शून्य onMeasure (int चौड़ाईMeasureSpec, int heightMeasureSpec) {int w = getDableable ()। getIntrinsicWidth (); ...} BTW, मैं इसे कोड में उपयोग किया गया था (और एक डिफ़ॉल्ट छवि है), xml में नहीं।
आरआरटीडब्लू

इस दृश्य में अजीब मुद्दे हैं जब एक ग्रिड दृश्य में उपयोग किया जा रहा है। जब तक आप स्क्रॉल नहीं करते तब तक यह अदृश्य रहता है।
Android डेवलपर


3

इसके अलावा, यदि आप किसी ImageView को 180 डिग्री लंबवत या क्षैतिज रूप से घुमाना चाहते हैं, तो आप उनका उपयोग scaleYया scaleXगुण कर सकते हैं और उन्हें सेट कर सकते हैं -1f। यहाँ एक कोटलिन उदाहरण है:

imageView.scaleY = -1f
imageView.scaleX = -1f

1f मान का उपयोग किसी ImageView को उसकी सामान्य स्थिति में लौटने के लिए किया जाता है:

imageView.scaleY = 1f
imageView.scaleX = 1f

2

मेरे पास इसका हल है। वास्तव में यह एक समस्या का समाधान है जो रोटेशन के बाद उत्पन्न होती है (आयताकार छवि इमेजिविव फिट नहीं होती है) लेकिन यह आपकी समस्या को भी कवर करती है .. हालांकि इस समाधान में बेहतर या बदतर के लिए एनीमेशन है।

    int h,w;
    Boolean safe=true;

गतिविधि के आरम्भ में इमेज व्यू के मापदंडों को प्राप्त करना संभव नहीं है। ऐसा करने के लिए कृपया इस समाधान का संदर्भ लें या एक बटन के क्लिक पर आयाम सेट करें।

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

यह समाधान ऊपर की समस्या के लिए पर्याप्त है। हालांकि यह इमेज व्यू को सिकोड़ देगा, भले ही यह आवश्यक न हो (जब चौड़ाई चौड़ाई से छोटा हो)।


2

मुझे सबसे अच्छा तरीका लगता है :)

int angle = 0;
imageView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            angle = angle + 90;
            imageView.setRotation(angle);
        }
    });

2

देरी से Android में एक छवि घुमाएँ:

imgSplash.animate().rotationBy(360f).setDuration(3000).setInterpolator(new LinearInterpolator()).start();

1

एक कस्टम दृश्य पर यह प्रयास करें

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


1

यहाँ 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;
}

उपयोग:

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

अगर आप बिटमैप को घुमाना चाहते हैं, लेकिन OOM से डरते हैं, तो आप यहाँ बने NDK समाधान का उपयोग कर सकते हैं


1

यदि आप केवल उस दृश्य को घुमाना चाहते हैं जो आप उपयोग कर सकते हैं:

iv.setRotation(float)

1

कोटलिन के लिए,

mImageView.rotation = 90f //angle in float

यह छवि को घुमाने के बजाय छवि दृश्य को घुमाएगा

इसके अलावा, हालांकि इसकी एक विधि Viewकक्षा में है। इसलिए आप इसका उपयोग करके किसी भी दृश्य को बहुत अधिक घुमा सकते हैं।


0

अफसोस की बात है, मुझे नहीं लगता कि वहाँ है। Matrixवर्ग सभी छवि जोड़तोड़ के लिए जिम्मेदार है, चाहे वह घूर्णन कर रहा है, सिकुड़ते / बढ़ रही है, को बढ़ा, आदि

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

मेरी क्षमायाचना, लेकिन मैं एक विकल्प के बारे में नहीं सोच सकता। हो सकता है कि कोई और व्यक्ति सक्षम हो, लेकिन जिस समय मैंने एक छवि का हेरफेर किया है, मैंने मैट्रिक्स का उपयोग किया है।

शुभकामनाएँ!


0

एक और संभावित समाधान है कि आप अपना स्वयं का कस्टम चित्र देखें (कहें RotateableImageView extends ImageView) ... और ऑनड्राइव () को कैनवस पर फिर से शुरू करने से पहले कैनवास / बिटमैप को घुमाने के लिए ओवरराइड करें। कैनवास को वापस लाने के लिए मत भूलना।

लेकिन अगर आप केवल एक ही उदाहरण को देखने के लिए घूम रहे हैं, तो आपका समाधान पर्याप्त होना चाहिए।


0

मैट्रिक्स और एनिमेटेड के बिना:

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

0

बस अपने 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); 

0

इस कोड को 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);
            }
        }

0

छवि को बिटमैप में परिवर्तित करने के बजाय और फिर इसे नीचे की तरह प्रत्यक्ष छवि दृश्य को घुमाने की कोशिश करें।

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

0

किसी चित्र के निरंतर घूमने के लिए नीचे दिए गए उत्तर का पालन करें

int i=0;

यदि रोटेट बटन पर क्लिक किया जाता है

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

0

अगर आप किसी चित्र को 180 डिग्री तक घुमाना चाहते हैं तो इन दो मानों को इमेजव्यू टैग में डालें: -

android:scaleX="-1"
android:scaleY="-1"

स्पष्टीकरण: - स्केलएक्स = १ और स्केल = १ रिपेसेन्ट यह सामान्य अवस्था है लेकिन अगर हम स्केल १ / स्केल की संपत्ति पर १ डालते हैं तो इसे १ scale० डिग्री से घुमाया जाएगा


0
Matrix matrix = new Matrix();
imageView.setScaleType(ImageView.ScaleType.MATRIX); //required
matrix.postRotate((float) 20, imageView.getDrawable().getBounds().width()/2, imageView.getDrawable().getBounds().height()/2);
imageView.setImageMatrix(matrix);

कैसे इस्तेमाल करे?

public class MainActivity extends AppCompatActivity {
   int view = R.layout.activity_main;
   TextView textChanger;
   ImageView imageView;
   @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN)
   @Override
   protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(view);
      textChanger = findViewById(R.id.textChanger);
      imageView=findViewById(R.id.imageView);
      textChanger.setOnClickListener(new View.OnClickListener() {
         @Override
         public void onClick(View v) {
            roateImage(imageView);
         }
      });
   }
   private void roateImage(ImageView imageView) {
      Matrix matrix = new Matrix();
      imageView.setScaleType(ImageView.ScaleType.MATRIX); //required
      matrix.postRotate((float) 20, imageView.getDrawable().getBounds().width()/2,    imageView.getDrawable().getBounds().height()/2);
      imageView.setImageMatrix(matrix);
   }
}

0

आप बस ImageView के रोटेशन एट्रीब्यूट का उपयोग कर सकते हैं

नीचे Android स्रोत से विवरण के साथ ImageView की विशेषता है

<!-- rotation of the view, in degrees. -->
<attr name="rotation" format="float" />
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.