【问题标题】:How to rotate a RelativeLayout by 180 degrees?如何将 RelativeLayout 旋转 180 度?
【发布时间】:2013-06-14 08:00:52
【问题描述】:

我正在尝试制作一个应用程序,该应用程序适用于两个人并且都可以看到其中的一半,因此我需要垂直翻转一半。我使用的是LinearLayout,里面有两个RelativeLayouts,里面有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 (stackoverflow.com/a/13056400/1122966)。我正在寻找解决方案。
  • 好吧,我对 android 还很陌生,也许使用 RelativeLayout 对这些东西不重要?我只是认为它给了我在屏幕上放置元素的最大灵活性

标签: java android android-relativelayout


【解决方案1】:

试试这个:

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

结果是:

【讨论】:

  • 有效!但是子视图上的点击区域保持在与未旋转相同的位置。我该如何解决?
【解决方案2】:

非常有趣的问题!

您也许可以尝试创建两个部分透明的Activity-s,显示它们自己的相同布局 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 的 RelativeLayout 部分Activity B 的部分重叠。

您也可以输入相应的launch mode of the Activity-s to "single top" 或其他合适的值,这样在“重新启动”时就不会创建Activity 的新实例,即传递“make-a-move-票”给对手。

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

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

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

干杯!

【讨论】:

  • 唉,这种情况下的“优势”也是一个劣势……两个人不轮流,他们只是在适当的时候点击他们的部分>。>但这是一个有趣的解决方案,我从没想过直接在手机上“翻转”一部分
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-09-20
  • 1970-01-01
  • 2016-11-02
  • 2016-02-13
  • 1970-01-01
  • 2019-11-25
  • 1970-01-01
相关资源
最近更新 更多