Повернуть вид иерархии на 90 градусов

Я работаю над подклассом FrameLayout, который должен повернуть все свои дочерние элементы на 90 градусов. Я делаю это, чтобы преодолеть ограничение только для альбомной камеры, присутствующее в Android 2.1 и ниже, с помощью действия, которое должно быть в альбомной ориентации, но помещая наложение моей камеры в это наложение кадра, чтобы оно выглядело, как если бы оно было портретным (вот как это делает Layar) Для этого я адаптируюсьКод Джеффа Шарки вращать взгляды. Моя проблема в том, что я могу вращать Framelayout, но я не могу изменить его размер, чтобы соответствовать новым измерениям. Таким образом, на моем g1 вместо портретного вида 320x480 с видом камеры 480x320 в альбомной ориентации я получаю коробку 320x320 посередине, показывающую мой портретный вид с отрубленными сторонами.

Вот мой код до сих пор:

public class RotateLayout extends FrameLayout {
    private Matrix mForward = new Matrix();
    private Matrix mReverse = new Matrix();
    private float[] mTemp = new float[2];

    public RotateLayout(Context context) {
        super(context);
    }

    public RotateLayout(Context context, AttributeSet attrs) {
        super(context, attrs);

    }


    /* (non-Javadoc)
     * @see android.widget.FrameLayout#onMeasure(int, int)
     */
    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        //This didn't work:
        //super.onMeasure(heightMeasureSpec, widthMeasureSpec);
    }

    /* (non-Javadoc)
     * @see android.widget.FrameLayout#onSizeChanged(int, int, int, int)
     */
    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        super.onSizeChanged(w, h, oldw, oldh);
    }

    @Override
    protected void dispatchDraw(Canvas canvas) {
        canvas.rotate(270, getWidth()/2, getHeight()/2);
        //This code will stretch the canvas to accommodate the new screen size. This is not what I want.
        //float scaleX=(float)getHeight()/getWidth();
        //float scaleY=(float)getWidth()/getHeight();
        //canvas.scale(scaleX, scaleY,  getWidth()/2, getHeight()/2);
        mForward = canvas.getMatrix();
        mForward.invert(mReverse);
        canvas.save();
        canvas.setMatrix(mForward); //This is the matrix we need to use for proper positioning of touch events
        super.dispatchDraw(canvas);
        canvas.restore();
    }

    @Override
    public boolean dispatchTouchEvent(MotionEvent event) {
        final float[] temp = mTemp;
        temp[0] = event.getX();
        temp[1] = event.getY();

        mReverse.mapPoints(temp);

        event.setLocation(temp[0], temp[1]);
        return super.dispatchTouchEvent(event);
    }
}

Я попытался переопределитьOnMeasure чтобы переключить размеры X и Y в View, но не смогли заставить это работать. Любая помощь, которую вы можете оказать, очень ценится.

Ответы на вопрос(6)

Ваш ответ на вопрос