web-dev-qa-db-ja.com

Android:imageview内の画像を角度で回転させる

次のコードを使用して、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);
137
rijinrv

ImageViewname__を回転させるもう1つの簡単な方法:
更新日
必要な輸入品:

import Android.graphics.Matrix;
import Android.widget.ImageView;

コード:(imageViewname__、anglename__、pivotXname__およびpivotYname__が既に定義されていると仮定して)

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

この方法では、毎回新しいビットマップを作成する必要はありません。

注:ImageViewname__を実行時にontouchに回転させるには、onTouchListenerImageViewname__に設定し、最後の2行を追加して回転させることができます(つまりpostRotate matrix&タッチリスナーの上記のコードセクションでimageView)に設定してくださいACTION_MOVE part。

186
Aks

APIが11以上のmImageView.setRotation(angle)

160
Frolik

API 11以降をサポートしている場合は、次のXML属性を使用することができます。

Android:rotation="90"

Android Studio xmlプレビューでは正しく表示されない場合がありますが、それは予想どおりに機能します。

59
Oleksiy

それには2つの方法があります。

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回転させたいRotateAnimationViewを使用し、AnimationがfillAfter=trueduration=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を膨らませます:

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

私はこれがめちゃくちゃ遅いのを知っていますが、それは他の人を助けるかもしれないのでそれは私にとっては役に立ちました。

API 11以降、imageView.setRotation(angleInDegrees);メソッドを使用してImageViewの絶対回転をプログラムで設定できます。

絶対的に言うと、現在の回転を追跡しなくても、この関数を繰り返し呼び出すことができます。つまり、15FsetRotation()メソッドに渡して回転させ、次に30Fを使用してsetRotation()を再度呼び出すと、画像の回転は45度ではなく30度になります。

注:これは、実際にはImageViewだけではなく、Viewオブジェクトのすべてのサブクラスで機能します。

8
thomaspsk

これは私の RotatableImageViewの実装 です。使い方はとても簡単です。attrs.xmlRotatableImageView.Javaをコピーするだけです。プロジェクトに追加して、RotatableImageViewをレイアウトに追加します。 example:angleパラメータを使用して希望の回転角度を設定します。

<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()メソッドのコードを変更するか、代わりにdraw()メソッドを使用してください。

5
petrnohejl

また、ImageViewを垂直方向または水平方向に180度回転させる場合は、scaleYまたはscaleXプロパティを使用してそれらを-1fに設定することもできます。これがKotlinの例です。

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

1f値はImageViewを通常の状態に戻すために使用されます。

imageView.scaleY = 1f
imageView.scaleX = 1f
3
Yamashiro Rion

私は最善の方法だと思います:)

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

これに 解決策 があります。実際には回転後に発生する問題の解決策です(長方形の画像はImagViewに合いません)が、それはあなたの問題もカバーしています。

    int h,w;
    Boolean safe=true;

ImageViewのパラメータを取得することは、アクティビティの初期化では不可能です。そうするには、これを参照してください 解決策またはボタンのクリック時の寸法

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

これは、上記の問題を解決するのに十分です。必要でなくてもimageViewが縮小されますが(高さがWidthよりも小さい場合)、問題がある場合は、scaleX/scaleYの内部に別の3項演算子を追加できます。

2

このようにすることもできます: -

imageView.animate().rotation(180).start();

ここから

2
Debasish Ghosh

これは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

カスタムビューでこれを試してください

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
jeet.chanchawat

ビューを視覚的に回転させるだけの場合は、次のようにします。

iv.setRotation(float)
1
mgm

もう一つの可能​​な解決策はあなた自身のカスタムイメージビュー(例えばRotateableImageView extends ImageView)を作成することです。そしてキャンバスに並べ替える前にキャンバス/ビットマップのどちらかを回転させるためにonDraw()をオーバーライドしてください。

しかし、画像ビューのインスタンスを1つだけ回転させるのであれば、解決策は十分なはずです。

0

このコードを試してみてください。

回転ボタンをクリックしてこのコードを書く:

        @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
Gaurav Sharma

Androidの画像を遅らせて回転させる:

imgSplash.animate().rotationBy(360f).setDuration(3000).setInterpolator(new LinearInterpolator()).start();
0
Aftab Alam
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

これをあなたの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

画像をビットマップに変換してから回転させるのではなく、次のコードのように直接画像ビューを回転させてみてください。

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
SWAPDROiD

Imageviewの連続的な回転のために以下の答えに従ってください

int i=0;

回転ボタンをクリックした場合

imageView.setRotation(i+90);
i=i+90;
0
Harish Reddy

残念ながら、私はそこにいるとは思わない。 Matrixクラスは、回転、縮小/拡大、傾斜など、すべての画像操作を担当します。

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

申し訳ありませんが、他の方法は考えられません。たぶん他の誰かができるかもしれませんが、私はマトリックスを使用した画像を操作しなければならなかった時代。

頑張って!

0
roboguy12

画像を180度回転させたい場合は、次の2つの値をimageviewタグに追加します。

Android:scaleX="-1"
Android:scaleY="-1"

説明:-scaleX = 1およびscaleY = 1は通常の状態ですが、scaleX/scaleYプロパティに-1を設定すると、180度回転します

0
Prashant Kumar

マトリックスなしでアニメ化:

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