次のコードを使用して、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
name__を回転させるもう1つの簡単な方法:
更新日
必要な輸入品:
import Android.graphics.Matrix;
import Android.widget.ImageView;
コード:(imageView
name__、angle
name__、pivotX
name__およびpivotY
name__が既に定義されていると仮定して)
Matrix matrix = new Matrix();
imageView.setScaleType(ImageView.ScaleType.MATRIX); //required
matrix.postRotate((float) angle, pivotX, pivotY);
imageView.setImageMatrix(matrix);
この方法では、毎回新しいビットマップを作成する必要はありません。
注:
ImageView
name__を実行時にontouchに回転させるには、onTouchListenerをImageView
name__に設定し、最後の2行を追加して回転させることができます(つまりpostRotate matrix&タッチリスナーの上記のコードセクションでimageView)に設定してくださいACTION_MOVE part。
APIが11以上のmImageView.setRotation(angle)
API 11以降をサポートしている場合は、次のXML属性を使用することができます。
Android:rotation="90"
Android Studio xmlプレビューでは正しく表示されない場合がありますが、それは予想どおりに機能します。
それには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回転させたいRotateAnimation
にView
を使用し、Animationが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を膨らませます:
Animation rotation = AnimationUtils.loadAnimation(this, R.anim.rotation);
myView.startAnimation(rotation);
私はこれがめちゃくちゃ遅いのを知っていますが、それは他の人を助けるかもしれないのでそれは私にとっては役に立ちました。
API 11以降、imageView.setRotation(angleInDegrees);
メソッドを使用してImageViewの絶対回転をプログラムで設定できます。
絶対的に言うと、現在の回転を追跡しなくても、この関数を繰り返し呼び出すことができます。つまり、15F
をsetRotation()
メソッドに渡して回転させ、次に30F
を使用してsetRotation()
を再度呼び出すと、画像の回転は45度ではなく30度になります。
注:これは、実際にはImageViewだけではなく、Viewオブジェクトのすべてのサブクラスで機能します。
これは私の RotatableImageViewの実装 です。使い方はとても簡単です。attrs.xmlとRotatableImageView.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()メソッドを使用してください。
また、ImageViewを垂直方向または水平方向に180度回転させる場合は、scaleY
またはscaleX
プロパティを使用してそれらを-1f
に設定することもできます。これがKotlinの例です。
imageView.scaleY = -1f
imageView.scaleX = -1f
1f
値はImageViewを通常の状態に戻すために使用されます。
imageView.scaleY = 1f
imageView.scaleX = 1f
私は最善の方法だと思います:)
int angle = 0;
imageView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
angle = angle + 90;
imageView.setRotation(angle);
}
});
これに 解決策 があります。実際には回転後に発生する問題の解決策です(長方形の画像は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項演算子を追加できます。
これは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ソリューションを使うことができます ここ =
カスタムビューでこれを試してください
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);
}
}
ビューを視覚的に回転させるだけの場合は、次のようにします。
iv.setRotation(float)
もう一つの可能な解決策はあなた自身のカスタムイメージビュー(例えばRotateableImageView extends ImageView
)を作成することです。そしてキャンバスに並べ替える前にキャンバス/ビットマップのどちらかを回転させるためにonDraw()をオーバーライドしてください。
しかし、画像ビューのインスタンスを1つだけ回転させるのであれば、解決策は十分なはずです。
このコードを試してみてください。
回転ボタンをクリックしてこのコードを書く:
@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);
}
}
Androidの画像を遅らせて回転させる:
imgSplash.animate().rotationBy(360f).setDuration(3000).setInterpolator(new LinearInterpolator()).start();
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);
}
}
これをあなたの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);
画像をビットマップに変換してから回転させるのではなく、次のコードのように直接画像ビューを回転させてみてください。
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);
Imageviewの連続的な回転のために以下の答えに従ってください
int i=0;
回転ボタンをクリックした場合
imageView.setRotation(i+90);
i=i+90;
残念ながら、私はそこにいるとは思わない。 Matrix
クラスは、回転、縮小/拡大、傾斜など、すべての画像操作を担当します。
http://developer.Android.com/reference/Android/graphics/Matrix.html
申し訳ありませんが、他の方法は考えられません。たぶん他の誰かができるかもしれませんが、私はマトリックスを使用した画像を操作しなければならなかった時代。
頑張って!
画像を180度回転させたい場合は、次の2つの値をimageviewタグに追加します。
Android:scaleX="-1"
Android:scaleY="-1"
説明:-scaleX = 1およびscaleY = 1は通常の状態ですが、scaleX/scaleYプロパティに-1を設定すると、180度回転します
マトリックスなしでアニメ化:
{
img_view = (ImageView) findViewById(R.id.imageView);
rotate = new RotateAnimation(0 ,300);
rotate.setDuration(500);
img_view.startAnimation(rotate);
}