Повернуть иерархию просмотра на 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, но не смог заставить это работать. Будем благодарны за любую помощь, которую вы можете оказать.

35
задан Mahi 1 April 2013 в 06:53
поделиться