2015-07-20 2 views
0

Я создал сферический видеопроигрыватель и хочу предотвратить вращение вида, в котором он содержится (A Framelayout, который содержит представление Unity для 3D-сцены.) Я хочу, чтобы элементы управления для поворота (они существуют в Relative 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> 

Изображение: https://dl.dropboxusercontent.com/u/17087393/pivotalscreens/Screenshot_2015-07-19-23-36-31.jpg

+0

Имеются ли у ou пытается предотвратить вращение всего экрана? http://stackoverflow.com/questions/2730855/prevent-screen-rotation-android – JDenais

+0

Ссылка на изображение недоступна. – Gagan

ответ

0

Я могу предложить вам пойти на следующее решение,

Шаг 1.Create двух различных макетов (layout & layout_land) и определить дизайн

St ер 2.Use пользовательский вид, который простирается FrameLayout()

Шаг 3. Замените регулярные FrameLayout с пользовательской точки зрения,

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

Пример 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); 
     }}); 
    } 

Этот ответ был первоначально приведенный здесь,

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

Смежные вопросы