imageview マトリックスを使用して画像をランダムにスケーリングおよび回転しようとしています。以下のコードを参照してください。関連する場合と関連しない場合がある 2 つの問題が発生しています。
最初: 回転が機能せず、画像が回転せずに表示されます。
2番目:画像が再スケーリングされる範囲で、スケーリングが機能します。ただし、スケール定数が 1 より大きい場合は、イメージの一部だけが画面に表示されるように、イメージの一部が切り取られます。これは imageView の境界線と関係があると思いますが、どうすれば修正できますか?
よろしくお願いします。
final ImageView imageView = getImageView(); //Help function that provides imageViews
if(imageView == null) return;
Matrix imageMatrix = imageView.getImageMatrix();
imageMatrix.postRotate(randGen.nextFloat()*360);
float randomScale = randGen.nextFloat()*1.5f + 0.5f;
imageMatrix.postScale(randomScale, randomScale);
imageView.setImageBitmap(usedBitmap);
imageView.setImageMatrix(imageMatrix);
imageView.setScaleType(ScaleType.MATRIX);
RelativeLayout.LayoutParams layPar = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
layPar.leftMargin = pCenter.x; //pCenter is the point where the image is drawn.
layPar.topMargin = pCenter.y;
relativeLayout.addView(imageView, layPar);
更新:私はこの問題をしばらく抱えていましたが、上記のアプローチを使用して解決策を見つけられなかったため、代わりに View をサブクラス化してみました。これは私の View サブクラスです。画像は回転もスケーリングもされていないように見えます。これらのソリューションが機能しない理由が本当にわかりません。誰?
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.view.View;
public class ScaleRotateView extends View {
Bitmap image;
float rotation;
float scaleX;
float scaleY;
public ScaleRotateView(Context context, Bitmap image, float rotation, float scaleX, float scaleY) {
super(context);
this.image = image;
this.rotation = rotation;
this.scaleX = scaleX;
this.scaleY = scaleY;
}
@Override
public void draw(Canvas canvas) {
super.draw(canvas);
canvas.drawBitmap(image, 0, 0, new Paint());
Matrix matrix = canvas.getMatrix();
matrix.preRotate(rotation, image.getWidth()/2, image.getHeight()/2);
matrix.setScale(scaleX, scaleY);
canvas.setMatrix(matrix);
//I also tried using canvas.rotate() and canvas.scale, but to no avail.
}
}