2015-10-14 17 views
6

complex viewの回転を手動で処理するようにしています。これには、プロッパの位置とサイズの復元も含まれます。この瞬間、私はonLayoutでそれをやろうとしています(より良いアイデアは歓迎です)。時にはうまくいくこともありますが、最初の回転は誤った位置になることが多く、子供がいなくても見ることができます。このコードで回転後のビューステートを正しく復元する方法

private int oldOrientation = -1; 

    /** 
    * Override method to configure the dragged view and secondView layout properly. 
    */ 
    @Override protected void onLayout(boolean changed, int left, int top, int right, int bottom) { 
    Log.e("mylayout", "onLayout " + df.format(new Date(Calendar.getInstance().getTimeInMillis()))); 
    if (isInEditMode()) { 
     super.onLayout(changed, left, top, right, bottom); 
    } else { 
     dragView.setVisibility(INVISIBLE); 
     if (isDragViewAtTop() && (oldOrientation != getResources().getConfiguration().orientation || oldOrientation == -1)) { 
     dragView.layout(left, top, right, transformer.getOriginalHeight()); 
     secondView.layout(left, transformer.getOriginalHeight(), right, bottom); 
     ViewHelper.setY(dragView, top); 
     ViewHelper.setY(secondView, transformer.getOriginalHeight()); 
     ViewHelper.setX(dragView, left); 
     ViewHelper.setX(secondView, left); 
     oldOrientation = getResources().getConfiguration().orientation; 
     } else if (isClosedAtLeft() && (
      oldOrientation != getResources().getConfiguration().orientation 
       || oldOrientation == -1)) { 
     dragView.layout(left, top, right, transformer.getOriginalHeight()); 
     secondView.layout(left, transformer.getOriginalHeight(), right, bottom); 
     ViewHelper.setY(dragView, top); 
     ViewHelper.setY(secondView, transformer.getOriginalHeight()); 
     ViewHelper.setX(dragView, left); 
     ViewHelper.setX(secondView, left); 
     closeToLeft(); 
     oldOrientation = getResources().getConfiguration().orientation; 
     } else if (isClosedAtRight() && (
      oldOrientation != getResources().getConfiguration().orientation 
       || oldOrientation == -1)) { 
     dragView.layout(left, top, right, transformer.getOriginalHeight()); 
     secondView.layout(left, transformer.getOriginalHeight(), right, bottom); 
     ViewHelper.setY(dragView, top); 
     ViewHelper.setY(secondView, transformer.getOriginalHeight()); 
     ViewHelper.setX(dragView, left); 
     ViewHelper.setX(secondView, left); 
     closeToRight(); 
     oldOrientation = getResources().getConfiguration().orientation; 
     } else if ((oldOrientation != getResources().getConfiguration().orientation 
      || oldOrientation == -1)) { 
     dragView.layout(left, top, right, transformer.getOriginalHeight()); 
     secondView.layout(left, transformer.getOriginalHeight(), right, bottom); 
     ViewHelper.setY(dragView, top); 
     ViewHelper.setY(secondView, transformer.getOriginalHeight()); 
     ViewHelper.setX(dragView, left); 
     ViewHelper.setX(secondView, left); 
     smoothSlideTo(SLIDE_BOTTOM); 
     oldOrientation = getResources().getConfiguration().orientation; 
     } 
     dragView.setVisibility(VISIBLE); 
    } 
    } 

、私はonLayoutが呼び出されたときに、回転後の初期STTEを復元しようとし、その後の場所に移動し、ビューには、(左へcreenのうち4つの状態は、外の、ある回転前でした右から左、上から右、または右下)。

編集:

<?xml version="1.0" encoding="utf-8"?> 
<manifest 
    package="com.github.pedrovgs.sample" 
    xmlns:android="http://schemas.android.com/apk/res/android"> 

    <uses-sdk android:minSdkVersion="8" /> 

    <!-- Permissions --> 

    <uses-permission android:name="android.permission.INTERNET" /> 
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
    <uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" /> 
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 

    <uses-feature 
     android:glEsVersion="0x00020000" 
     android:required="true" /> 

    <!-- Application configuration --> 

    <application 
     android:name=".DraggablePanelApplication" 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name" 
     android:theme="@style/AppTheme"> 

     <!-- Maps API KEY --> 

     <meta-data 
      android:name="com.google.android.maps.v2.API_KEY" 
      android:value="AIzaSyC1rMU-mkhoyTvBIdTnYU0dss0tU9vtK48" /> 

     <!-- Main Activity --> 

     <activity 
      android:name=".activity.MainActivity" 
      android:configChanges="keyboardHidden|orientation|screenSize" 
      android:label="@string/app_name"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 

     <!-- Places sample --> 

     <activity 
      android:name=".activity.PlacesSampleActivity" 
      android:configChanges="keyboardHidden|orientation|screenSize" 

      android:label="@string/places_sample_activity_title" /> 

     <!-- TV Shows sample --> 

     <activity 
      android:name=".activity.TvShowsActivity" 
      android:label="@string/tv_shows_sample_activity_title" /> 


     <!-- Youtube Sample --> 

     <activity 
      android:name=".activity.YoutubeSampleActivity" 
      android:configChanges="keyboardHidden|orientation|screenSize" 

      android:label="@string/youtube_sample_activity_title" /> 


     <!-- Video Sample --> 

     <activity 
      android:name=".activity.VideoSampleActivity" 
      android:configChanges="keyboardHidden|orientation|screenSize" 

      android:label="@string/video_sample_activity_title" /> 

     <meta-data 
      android:name="com.google.android.gms.version" 
      android:value="@integer/google_play_services_version" /> 

    </application> 

</manifest> 

サンプル活動XML

<?xml version="1.0" encoding="utf-8"?> 

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:draggable_panel="http://schemas.android.com/apk/res-auto" 
    android:id="@+id/fl_container" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <!-- Movie Thumbnail --> 

    <ImageView 
     android:id="@+id/iv_thumbnail" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     style="@style/image_view"/> 

    <!-- DraggablePanel --> 

    <com.github.pedrovgs.DraggablePanel 
     android:id="@+id/draggable_panel" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     draggable_panel:x_scale_factor="@dimen/x_scale_factor" 
     draggable_panel:y_scale_factor="@dimen/y_scale_factor" 
     draggable_panel:top_fragment_height="@dimen/top_fragment_height" 
     draggable_panel:top_fragment_margin_right="@dimen/top_fragment_margin" 
     draggable_panel:top_fragment_margin_bottom="@dimen/top_fragment_margin" 
     draggable_panel:enable_horizontal_alpha_effect="false"/> 

</FrameLayout> 
+0

良い方法だと思いますか..?あなたは回転で何か特別なことをしていない場合、回転を無視することができます... –

+0

@sourabhbansは 'android:configChanges =" locale | keyboardHidden | orientation | screenSize " 'についてですか?私はそれを使用しているので、なぜ私は手動でのビュー(アクティビティではない)について質問しています – Yarh

+0

Ok .. sory私は誤解されて.. –

答えて

1

あなたは、XMLまたはコードでDraggableViewに任意のchild追加されていない、まだ代わりViewViewGroupを拡張してきました。 DraggableViewにはaddChildや子ども関連のコードが表示されません。 topFragmentbottomFragmentなどを使用しており、ViewGroup内でフラグメント取引を行うにはaddFragmentToView()を使用しています。悪いアイデア!

私はそれが困難で時間がかかることを知っています。しかし、このビューのデザインについて考える必要はありません。これらの子どもをDraggableViewに子供として扱い、FragmentManagerをこのビューに入れずに実行し、addTransactionを実行することを強くお勧めします。

子孫としてフラグメントをViewGroupに追加すると、多くの合併症はなくなります。私はこれまでの経験からこう言います。 onLayout()ViewGroupの中にChild Viewsを配置するために使用されます。デバイスを回転させると、onLayout()が再び呼び出され、子ビューが必要に応じて配置されます。それは非常に簡単です。このような概念化を始めると、ドラッグ操作は非常に簡単になります。

ViewGroupに子どもとしてFramgentsがあると思われる場合は、ViewPagerコードhereを気に入ってください。これは、フラグメントを入力として使用しますが、それらをレイアウトの子として扱います。

  1. onLayout()の位置に関するすべてのものを処理してください。
  2. 位置データをonSaveInstanceState()に保存しないでください。これにはtextまたはdrawableのデータのみを保存してください。
  3. onCofigurationChanged()を無効にすることは常にお勧めします。

これは現在できませんが、長期的にはリファクタリングしてこのようにすることができます。このビューは その子のそれぞれにサイズと位置を割り当てる必要があるときに、レイアウトから呼び出され

onLayout()の真の目的を忘れないでください。子を持つ派生クラスは、 このメソッドをオーバーライドし、それぞれの子に対して呼び出しレイアウトを行う必要があります。

2

あなたがこれを必要としない、あなたのView秒のレイアウトに深く行くことにしようとしている場合は、あなたのViewActivity

android:configChanges="keyboardHidden|orientation|screenSize" 

回転後に設定されている場合は、アンドロイドケアActivityを再描画するかどうか、再描画するか、再計測するか、再配置するかなどを指定します。

あなたは ImageView配置[10 100]を使用してアプリを起動した場合ので、回転少年の後にあなたの ImageViewが配置されると想定されます

[10 100]時にはそれも、座標オフスクリーンあなたは奇妙与えるかもしれません。

+0

それでも、ビデオストリームに一時停止があります – Yarh

0

onConfigrationChange()オーバーライドメソッド このメソッドは、回転を処理します。

0

独自のカスタムビューを作成しているとします。その場合は、Viewクラスが提供する標準的なメカニズムを使用する必要があります。

@Override 
protected void onRestoreInstanceState(Parcelable state) { 
    // Restore state 
} 

@Override 
protected Parcelable onSaveInstanceState() { 
    // Save state 
} 
0

私はuがそれのためにマニフェストを使用していない理由は、これは

@Override 
    protected Parcelable onSaveInstanceState() { 
     Parcelable superState = super.onSaveInstanceState(); 
     return new YourParcelableObject(superState, yourValues); 
    } 

    @Override 
    protected void onRestoreInstanceState(Parcelable state) { 
     YourParcelableObject savedState = (SavedState) state; 
     super.onRestoreInstanceState(savedState.getSuperState()); 

     //restote other values from YourParcelableObject 
    } 
関連する問題