0

数日間調査しましたが、解決しませんでした。この質問の問題は私のものと似ていますが、これを使用しても問題を解決できませんでした。

明らかにされたビューが他のビューの上に膨らむwhatsappのように、円形の明らかにする効果を得ようとしました。私の場合、現在のJavaクラスのlayout.xmlに既に存在するレイアウトにアニメーションを適用すると、正常に動作しますが、問題は、私の場合はLInearLayoutである明らかにするレイアウトが他のコンテンツ(その下にある)をプッシュすることです) ダウンして、その場所を作ります。

この場合の私のレイアウトは次のとおりです。

<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent">

<io.codetail.widget.RevealFrameLayout
       android:layout_width="match_parent"
       android:layout_height="wrap_content">
       <LinearLayout
           android:id="@+id/reveal_items"
           android:layout_width="match_parent"
           android:layout_height="wrap_content"
           android:orientation="horizontal"  >
           <LinearLayout
               android:layout_width="0dp"
               android:layout_height="wrap_content"
               android:layout_weight="1"
               android:gravity="center"
               android:orientation="vertical">
               <ImageButton
                   android:layout_width="70dp"
                   android:layout_height="70dp"
                   android:background="@drawable/icon_camera" />
               <TextView
                   android:layout_width="wrap_content"
                   android:layout_height="wrap_content"
                   android:layout_marginTop="16dp"
                   android:text="Gallery" />
           </LinearLayout>
           <!-- Other 2 icons here-->

       </LinearLayout>
   </io.codetail.widget.RevealFrameLayout>

   <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Enter Name" />

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="OK" />

LinearLayout/>

私の公開レイアウトは EditText とボタンを押し下げて配置しますが、それらの上に公開したいと思います..

次に、明らかにするビュー コードを別の Reveal-layout.xml ファイルに配置し、そのレイアウトを Javacode で作成された View(私の場合は LinearLayout) に拡張しようとしました。そして、この LinearLayout に明らかにする効果を適用しようとしましたが、「デタッチされたビューでこのアニメーターを開始できません」という例外が発生します。

私の Revealing-layout.xml は次のようになります

<io.codetail.widget.RevealFrameLayout
       android:layout_width="match_parent"
       android:layout_height="wrap_content">
       <LinearLayout
           android:id="@+id/reveal_items"
           android:layout_width="match_parent"
           android:layout_height="wrap_content"
           android:orientation="horizontal"  >
           <LinearLayout
               android:layout_width="0dp"
               android:layout_height="wrap_content"
               android:layout_weight="1"
               android:gravity="center"
               android:orientation="vertical">
               <ImageButton
                   android:layout_width="70dp"
                   android:layout_height="70dp"
                   android:background="@drawable/icon_camera" />
               <TextView
                   android:layout_width="wrap_content"
                   android:layout_height="wrap_content"
                   android:layout_marginTop="16dp"
                   android:text="Gallery" />
           </LinearLayout>
           <!-- Other 2 icons here-->

       </LinearLayout>
   </io.codetail.widget.RevealFrameLayout>

ボタンをクリックすると、関数RevealView();が呼び出されます。 以下のようになります。

public void revealView()
{
    int cx = (mRevealView.getLeft() + mRevealView.getRight());
    int cy = mRevealView.getTop();
    int radius = Math.max(mRevealView.getWidth(), mRevealView.getHeight());

    // and all animations here, the animator is working fine so i did not put the code here
} 

MainActivity onCreate()でmRevealView=(LinearLayout)findviewbyid(R.id.reveal_items)としてmRevealView を初期化し、インフレートしてビューを割り当てると、アニメーターはこのビューで正常に動作します。しかし、 mRevealView=new LinearLayout(this)のような新しいレイアウトを作成し、そのパラメータなどをすべて設定しようとすると、アニメーターを適用するとこのエラーが発生します。 切り離されたビューでこのアニメーションを開始することはできません。

ここで私が間違っていることは、誰でも私に提案できます。

4

2 に答える 2

1

次のように、リビール コードViewTreeObserverを意図したリビール レイアウトに配置してみてください。

boolean reveal = false;
button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            reveal = true;
        }
    });

LinearLayout layout = (LinearLayout) findViewById(R.id.reveal_items);
layout.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {                        
            if(reveal) {
                reveal = false;
                // start reveal animation here
                // ...
            }
            // for SDK >= 16
           ll.getViewTreeObserver().removeOnGlobalLayoutListener(this);
        }
 });
于 2015-09-18T08:22:12.500 に答える