0

I have created a spherical video player and wish to prevent rotation of the view it's contained in (A Framelayout that contains a Unity view of the 3D scene.) I want the controls to rotate (they exist in a Relative Layout within the container). But I do not want the unity container to rotate. Is this possible?

Here's the layout (all the controls are in the layout):

<FrameLayout
            android:id="@+id/unity_layout"
            android:visibility="invisible"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content">

        <FrameLayout
                android:id="@+id/unity_container"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content">
        </FrameLayout>

        <include layout="@layout/player_controls"/>

</FrameLayout>

Image: https://dl.dropboxusercontent.com/u/17087393/pivotalscreens/Screenshot_2015-07-19-23-36-31.jpg

d4Rk
  • 6,622
  • 5
  • 46
  • 60
lawrensm
  • 1
  • 1

1 Answers1

0

I can suggest you to go for the following solution,

Step 1.Create two different layouts (layout & layout_land) and define the design

Step 2.Use a custom view that extends FrameLayout()

Step 3. Replace the regular FrameLayout with your custom view,

<MyNonChangingLayout
 android:id="@+id/unity_container"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content">
</MyNonChangingLayout>

Example of MyNonChangingLayout(),

MyNonChangingLayout extends FrameLayout {
        MyNonchangingLayout(Context content) {
            super(context);
            myContext = context;
            makeFromXML();
        }

    private void makeFromXML() {
        LayoutInflater inflater = (LayoutInflater)myContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        topView =  inflater.inflate(MyR.layout.my_non_changing_layout, this, false);
        super.addView(topView);
    }

    /*
     * Then, you can override quite a lot of the layout's calls and
     * enforce behaviour on the children. Two examples:
     */

    // To specifically catch orientation changes
    @Overridge
    onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        // You could create the layout here by removing all views and rebuilding them
        // Perhaps by having a two xml layouts, one of which is "90 degrees out" ...
        // If you do make the layot here, make sure you don't clash with the constructor code!
        switch (newConfig.orientation) {
            case ORIENTATION_LANDSCAPE:
                // Make the layout for this orientation (as per above)
                break;
            case ORIENTATION_PORTRAIT:
                // Make the layout for this orientation (as per above)
                break;
            case ORIENTATION_SQUARE:
                // Make the layout for this orientation (as per above)
                break;
        }
    }

    //to handle size changes to enforce aspect ratios on children:
    @override
    protected void onSizeChanged (int w, int h, int oldw, int oldh) {
        super.onSizeChanged(w, h, oldw, oldh);

        int viewWidth = //something I've determine
        int viewHeight = //something I've determined
        setViewsize(viewToHaveSizedControlled, viewWidth, viewheight);
    }

    // The post thing means that it doesn't crash no matter which thread it is
    // executed on ...
    private void setViewsize(final View v, final int w, final int h) {
        post(new Runnable() {
            public void run() {
                ViewGroup.LayoutParams lp = v.getLayoutParams();
                lp.width = w;
                lp.height = h;
                v.setLayoutParams(lp);
        }});
    }

This answer was originally given here,

How to prevent orientation change for just a layout, not the whole screen/activity

Community
  • 1
  • 1
Prokash Sarkar
  • 11,723
  • 1
  • 37
  • 50