0

キャンバス上の一連のビットマップを特定の点を中心に回転させています。次の関数を使用して回転しています:

private void rotateGroupdAtPoint(ArrayList<MyBitmap> group, int degrees) {
        // TODO Auto-generated method stub

        float minx=100000,miny=100000,maxx=-100000,maxy=-100000;
        for(int i = 0; i < group.size(); i++) {
            MyBitmap m = group.get(i);
            if(minx > m.getX()) {
                minx = m.getX();
            }
            if(miny > m.getY()) {
                miny = m.getY();
            }
            if(maxx < m.getX() + m.getBmp().getWidth()) {
                maxx = m.getX() + m.getBmp().getWidth();
            }
            if(maxy < m.getY() + m.getBmp().getHeight()) {
                maxy = m.getY() + m.getBmp().getHeight();
            }
        }

        float x = (minx+maxx)/2;
        float y = (miny+maxy)/2;
        Log.d("minmax","min:"+minx+","+maxx+"    max:"+miny+","+maxy);


        for(int i = 0; i < group.size(); i++) {
            Log.d("position before","x:" + group.get(i).getX() + ", y:" + group.get(i).getY());
            float newx = (float)(((group.get(i).getX() - x) * Math.cos(Math.toRadians(degrees))) + ((group.get(i).getY() - y) * Math.sin(Math.toRadians(degrees)))) + x;
            float newy = (float)(((group.get(i).getX() - x) * Math.sin(Math.toRadians(degrees))) - ((group.get(i).getY() - y) * Math.cos(Math.toRadians(degrees)))) + y;
            group.get(i).setX(newx);
            group.get(i).setY(newy);
            group.get(i).setBmp(rotateBitmap(group.get(i).getBmp(), -90));
            Log.d("position","x:" + group.get(i).getX() + ", y:" + group.get(i).getY());

        }
    }


private Bitmap rotateBitmap(Bitmap bmp, int degrees) {
        if (degrees != 0 && bmp != null) {
            Matrix matrix = new Matrix();

            matrix.setRotate(degrees, (float) bmp.getWidth() / 2, (float) bmp.getHeight() / 2);
            try {
                Bitmap rotatedBmp = Bitmap.createBitmap(bmp, 0, 0, bmp.getWidth(), bmp.getHeight(), matrix, true);
                if (bmp != rotatedBmp) {
                    bmp.recycle();
                    bmp = rotatedBmp;
                }
            } catch (OutOfMemoryError ex) {
                return null;
            }
        }
        return bmp;
    }

まず、すべてのビットマップに共通する中間点を見つけて、その点を中心に回転します。現在、オリエンテーションに問題はありません。それを行うためのコードも追加します。しかし、私の問題は、ビットマップが中心点を中心に目的の角度で適切に回転していないことです。誰かが私が間違っている場所を教えてくれますか?

ここに画像の説明を入力

4

1 に答える 1

1

ビットマップをまったく回転させていません。setX()プロパティとプロパティを使用してsetY()、ビットマップを新しい場所に移動します。その上で、回転させる角度を決定し、メソッドとsetRotation()メソッドを組み合わせて使用​​する必要があります。setPivotX()setPivotY()

デフォルトでは、回転しているビューの中心点を中心setRotation(float radians)に画像を回転させます。radiansしたがって、 を呼び出すgroup.get(i).setRotation(Math.PI/2)と、ビットマップはその位置から 90 度回転します。

メソッドを呼び出すことで、回転するポイントを調整できsetPivot()ます。

View view = group.get(i);
view.setPivotX(0);
view.setPivotY(0);
view.setRotation(Math.PI/2);

これによりview、左上隅を中心に垂直な角度に回転します。

于 2012-11-16T12:31:35.197 に答える