2

時計回り/反時計回りに 90 度回転する可能性のある FrameLayout に基づいて ViewGroup を作成しようとしていますが、それでも正しく動作します

これまでのところ、私の結果はそれほど成功していません。今のところこんな感じです(左が回転前、右が回転後、真っ赤でごめんなさい)

回転したViewGroup

アクティビティのレイアウト

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

    <com.example.TestProject.RotatedFrameLayout
        android:id="@+id/container"
        android:layout_centerInParent="true"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#00F"/>

</RelativeLayout>

RotatedFrameLayout

public class RotatedFrameLayout extends FrameLayout {

    private boolean firstMeasure = true;

    public RotatedFrameLayout( Context context ) {
        super( context );
        init();
    }

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

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

    private void init() {
        setRotation( 90f );
    }

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

追加情報

  • ボタンをクリックできないため、アニメーションの回転を使用したくない
  • Nexus 7 では画面のナビゲーション ボタンが横向きに表示されるため、横向きモードを使用したくありません (これが、回転を大きくしようとしている主な理由です)。
  • 画面の左右だけが範囲外のようです
4

1 に答える 1

5

それはかなり難しく、やる価値はないと思います。しかし、本当にこれを行いたい場合は、次のものが必要です。

  • ViewGroup に正しいサイズの寸法を渡します (幅と高さを入れ替えます)。
  • ViewGroup キャンバスを 90 度回転します。この時点ですべて問題ないように見えますが、タッチ イベントが正しく機能していません。
  • すべてのタッチ イベントをインターセプトし、x と y を交換します。次に、固定イベントを ViewGroup に渡します。

私はコードサンプルを持っておらず、見たこともありません) この方法は機能するはずです。フラグメントがスケーリングされたときにタッチイベントの座標を修正する必要があるフラグメントでスケーリング変換を行いました。

私はそれを十分にテストしていませんが、これは機能します:

public class RotatedFrameLayout extends FrameLayout {

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

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

public RotatedFrameLayout(Context context) {
    super(context);
    init();
}

@SuppressLint("NewApi") 
private void init() {
    setPivotX(0);
    setPivotY(0);
    setRotation(90f);
}

@SuppressLint("NewApi") 
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    super.onMeasure(heightMeasureSpec, widthMeasureSpec);
    setTranslationX(getMeasuredHeight());
}
}

例

于 2013-02-22T14:04:56.113 に答える