如何将RelativeLayout旋转180度?

时间:2013-06-14 08:00:53

标签: java android relativelayout

我正在尝试制作一个应用程序,它适用于两个人并且都看到它的一半,所以我需要垂直翻转一半。我正在使用LinearLayout,其中RelativeLayout位于layout_weight="1"内。

事情是,我不知道如何做这个翻转。显然android:rotate仅适用于版本11+(3.0+),但我希望它支持至少2.2。

在阅读了关于SO的其他相关问题之后,我尝试了各种各样的东西,其中没有一个似乎有效。我试图扩展RelativeLayout并覆盖onDraw函数,但似乎没有做任何事情。这是我的代码:

public class FlippedRelativeLayout extends RelativeLayout
{
    public FlippedRelativeLayout(Context context)
    {
        super(context);
    }

    public FlippedRelativeLayout(Context context, AttributeSet attrs)
    {
        super(context, attrs);
    }

    public FlippedRelativeLayout(Context context, AttributeSet attrs,
            int defStyle)
    {
        super(context, attrs, defStyle);
    }

    @Override
    protected void onDraw(Canvas canvas)
    {
        canvas.save();
        canvas.rotate(180);
        super.onDraw(canvas);
        canvas.restore();
    }
}

我会很高兴得到任何帮助,谢谢!

2 个答案:

答案 0 :(得分:9)

试试这个:

public class MyRelativeLayout extends RelativeLayout {    
    public MyRelativeLayout(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        init();
    }

    public MyRelativeLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public MyRelativeLayout(Context context) {
        super(context);
        init();
    }

    private void init() {
        setStaticTransformationsEnabled(true);
    }

    @Override
    protected boolean getChildStaticTransformation(View child, Transformation t) {
        t.setTransformationType(Transformation.TYPE_MATRIX);
        Matrix m = t.getMatrix();
        m.reset();
        m.postRotate(180, child.getWidth() / 2.0f, child.getHeight() / 2.0f);
        return true;
    }
}

结果是: enter image description here

答案 1 :(得分:1)

非常有趣的问题!

您也许可以尝试创建两个部分透明的Activity - s,显示他们自己的相同布局xml的副本,然后切换活动Activity的“z顺序”,具体取决于转向它是要采取行动。

Activity A将是“您自己的”活动,它将具有透明的上半部分和RelativeLayout,因为它是下半部分。它还具有正常的屏幕方向,例如:setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT)

Activity B将是“你的对手活动”。它还有一个透明的上半部分和一个与底部相同的RelativeLayout的副本。然而,它将具有倒置的屏幕方向,例如:setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT)。这意味着Activity B的透明部分将与RelativeLayout A的 Activity部分重叠,并且 Activity A的透明部分将与RelativeLayout B的 Activity部分重叠。

你也可以输入相应的launch mode of the Activity-s to "single top"或其他合适的值,这样你就不会在“再次启动”时创建Activity的新实例,即传递“make-向对手发送一张机票。

不幸的是...REVERSE_PORTRAIT orientation wasn't added until API level 9(Android 2.3.something)并明确请求API级别8。

关于这种方法的简洁部分是因为一次只有一个Activity可以有焦点(因此,接受输入),你会自动获得用户输入的状态机:对手不可能与他/她的董事会互动,直到你做出行动,反之亦然。

希望至少能给你一些想法。

干杯!