Android вверх ногами макет или повернуть на 180 - PullRequest
0 голосов
/ 08 февраля 2012

Я кодирую игру для Android, в которой одновременно играют 2 игрока. Один игрок смотрит на телефон в обычном режиме, а другой - на него.

Поскольку это тест, я не использовал холст или графику. Он содержит только 2 линейных макета, и один из них должен быть вверх ногами. Для этого я использовал:

android:rotation="180"

для одного из макетов.

на графике моего xml в Eclipse он показывал вверх дном, но когда я запускаю его на эмуляторе или телефоне, он не переворачивается и не поворачивается на 180 градусов.

XML

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Button" />

    <LinearLayout
        android:id="@+id/linearLayout1"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical" android:clipToPadding="false"
        android:rotation="180">

    <Button
        android:id="@+id/button2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Button" />

    </LinearLayout>

</LinearLayout

Java-код

public class x extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }
}

Как я могу повернуть его без осложнений. В настоящее время я использую API-уровень 15, но у меня нет никаких ограничений на уровне API.

1 Ответ

1 голос
/ 08 февраля 2012

Я бы посоветовал вам создать пользовательский макет, который будет обрабатывать поворот на onDraw()

public class RotatedLinearLayout extends RotatedLinearLayout {
   final boolean topDown;

   public RotatedLinearLayout (Context context){
   super(context);
   }

   public RotatedLinearLayout (Context context, AttributeSet attrs){
      super(context, attrs);
   }

   public RotatedLinearLayout (Context context, AttributeSet attrs, int defStyle){
      super(context, attrs,defStyle);
   }  


   @Override
   protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec){
      super.onMeasure(heightMeasureSpec, widthMeasureSpec);
      setMeasuredDimension(getMeasuredHeight(), getMeasuredWidth());
   }

   @Override
   protected void onDraw(Canvas canvas){
      TextPaint textPaint = getPaint(); 
      textPaint.setColor(getCurrentTextColor());
      textPaint.drawableState = getDrawableState();

      canvas.save();

      if(topDown){
         canvas.translate(getWidth(), 0);
         canvas.rotate(180);
      }else {
         canvas.translate(0, getHeight());
         canvas.rotate(-180);
      }
      canvas.translate(getCompoundPaddingLeft(), getExtendedPaddingTop());
      getLayout().draw(canvas);
      canvas.restore();
  }
}

Когда вы пишете XML, используйте VerticalRelativeLayout вместо другого макета, который вы пытались создать.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Button" />

    <path.to.package.RotatedLinearLayout 
        android:id="@+id/linearLayout1"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical" android:clipToPadding="false"
        >

        <Button
            android:id="@+id/button2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Button" />

    </path.to.package.RotatedLinearLayout >

</LinearLayout
...