7

我正在尝试制作一个应用程序,该应用程序适用于两个人并且都可以看到其中的一半,因此我需要垂直翻转一半。我在其中使用 a LinearLayoutwith two RelativeLayouts with 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();
    }
}

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

4

2 回答 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;
    }
}

结果是: 在此处输入图像描述

于 2013-06-14T09:24:59.060 回答
1

非常有趣的问题!

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

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

ActivityB 将是“你的对手活动”。它还将有一个透明的上半部分和一个RelativeLayout与其底部完全相同的副本。但是,它将具有反转的屏幕方向,例如:setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT). 这意味着B的透明部分将与 A 的部分重叠,而A 的透明部分将与B的部分重叠。ActivityRelativeLayoutActivityActivityRelativeLayoutActivity

您还可以将 -s 的相应启动模式设置Activity为“单顶”或其他一些合适的值,这样您就不会Activity在“再次启动”时创建您的新实例,即传递“make-a-移动票”给对手。

不幸的是,直到 API 级别 9 (Android 2.3.something)...REVERSE_PORTRAIT才添加方向,并且您明确请求 API 级别 8。

这种方法的巧妙之处在于,由于一次只有一个 Activity 可以拥有焦点(因此,接受输入),您将自动获得用户输入的状态机:对手无法与之交互他/她的董事会,直到您采取行动,反之亦然。

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

干杯!

于 2013-06-14T09:00:36.520 回答