如何将RelativeLayout旋转180度?

7
我正在制作一个应用程序,该应用程序面向两个人,两个人都可以看到其中的一半,因此我需要将其中一半垂直翻转。我使用一个带有两个RelativeLayout的LinearLayout,在里面使用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();
    }
}

我很感激你的帮助,非常感谢!


一个RelativeLayout作为其父类ViewGroup,默认情况下不会调用onDraw方法(https://dev59.com/0mcs5IYBdhLWcg3wMhCz#13056400)。我正在寻找解决方案。 - spacifici
嗯,我对Android还很陌生,也许使用RelativeLayout并不适合这些事情?我只是认为它能够在屏幕上放置元素时给我最大的灵活性。 - argoneus
2个回答

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

结果是: 在此输入图片描述

它可以工作!但是子视图上的点击区域仍然保持不旋转的位置。我该如何解决这个问题? - Idemax

1

非常有趣的问题!

您可以尝试创建两个部分透明的Activity,显示自己的同一布局xml的副本,然后根据谁轮到移动来切换活动Activity的“z-order”。

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

Activity B将是"你的对手活动"。它也将有一个透明的顶部和一个与之完全相同的RelativeLayout副本作为其底部。但是,它将具有反向屏幕方向,例如:setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT)。这意味着Activity B的透明部分将重叠在Activity A的RelativeLayout部分上,而Activity A的透明部分将重叠在Activity B的RelativeLayout部分上。

您还可以将相应的“Activity”的启动模式设置为“single top”或其他合适的值,以便在“再次启动”时不创建Activity的新实例,即将“进行移动的票”传递给对手。

很不幸,...REVERSE_PORTRAIT方向 直到API级别9(Android 2.3.x)才被添加,而你明确请求API级别8。
这种方法的好处是,由于一次只有一个Activity可以获得焦点(因此接收输入),您将自动获得用户输入的状态机:对手在您进行移动之前不能与其板交互,反之亦然。
希望这至少给你一些想法。
干杯!

啊,这种情况下的“优势”也是一个劣势……两个人不轮流进行,只有在适当的时候点击他们的部分 >.> 但这是一个有趣的解决方案,我从来没有想过在手机上直接“翻转”一部分。 - argoneus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接