2

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

}
4

1 に答える 1

0

カスタムビューの onDraw メソッド内で試すことができます

 Matrix transform = new Matrix();
 transform.setTranslate(dx, dy);//
 transform.preRotate(degree,PivotX ,PivotY);
 canvas.drawBitmap(bitmap, transform, null);
于 2012-05-25T05:19:25.217 に答える