0

私はレイアウトを膨らませて画面に表示します。 今、レイアウトから部分的にレイアウトを移動したいと思います。私は、膨らんだレイアウトで.animate().translationX(-500)を使ってみました。それは私がそれを見てみたかった正確にどのように画面をオフに移動:後膨らんだレイアウト/ビューをアニメーションで新しい位置に移動

before moving

after moving

しかし、今、私は問題を抱えている前

レイアウトが元々占めていた領域はクリック可能ではありません(例:ホーム画面間でスワイプすることはできません。青色のマークされた領域の外側で働く)。どのように私は青い領域が移動した後にクリック可能ですが、私は後ろにそれを移動したい場合には、レイアウト(赤い部分)のremaing面積は依然としてクリック(例えばを登録することができ、ことを解決することができ

not clickable area

onClickListener)? 私はwindowManagerupdateViewLayout()の機能と一緒に働かなければならないと思いますが、私はパラメータに関して何を変更すべきか分かりません。

編集1:ここでは

はコードです。翻訳はボタンによってトリガーされます。

overlay.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="horizontal" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:background="#d8ff0000" 
    android:weightSum="1"> 

    <RelativeLayout 
     android:layout_width="match_parent" 
     android:layout_height="245dp"> 

     <TextView 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:textAppearance="?android:attr/textAppearanceLarge" 
      android:text="Lorem ipsum " 
      android:id="@+id/textView6" 
      android:layout_marginLeft="10dp" /> 

     <Button 
      android:layout_width="55dp" 
      android:layout_height="wrap_content" 
      android:text="X" 
      android:id="@+id/button" 
      android:layout_gravity="center_horizontal|top" 
      android:layout_alignParentTop="true" 
      android:layout_toEndOf="@+id/textView6" 
      android:layout_marginStart="27dp" /> 
    </RelativeLayout> 
</LinearLayout> 

レイアウトを膨張させるサービス:

OverlayService.java

public class FloatingMenu extends Service{ 

    private WindowManager wm; 
    private LinearLayout ll; 
    private boolean isPushedToSide = true; 


    @Nullable 
    @Override 
    public IBinder onBind(Intent intent) { 
     return null; 
    } 

    @Override 
    public void onCreate() { 
     super.onCreate(); 

     wm = (WindowManager) getSystemService(WINDOW_SERVICE); 
     ll = new LinearLayout(this); 


     LinearLayout.LayoutParams llParameters = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT); 
     ll.setBackgroundColor(Color.argb(50, 255, 255, 255)); 
     ll.setLayoutParams(llParameters); 

     final WindowManager.LayoutParams parameters = new WindowManager.LayoutParams(WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.TYPE_PHONE, WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, PixelFormat.TRANSLUCENT); 

     parameters.gravity = Gravity.LEFT | Gravity.TOP; 

     LayoutInflater li = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE); 
     ll = (LinearLayout) li.inflate(R.layout.overlay, null); 
     final Button b = (Button) ll.findViewById(R.id.button); 
     b.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       if (isPushedToSide) { 
        ll.animate().translationX(0); 
        isPushedToSide = false; 
       }else { 
        ll.animate().translationX(-450); 
        isPushedToSide = true; 
       } 
      } 
     }); 
     wm.addView(ll, parameters); 
    } 
} 

編集2:

私の研究を続けながら、.animate().translationX()は、ビュー自体が表示されるのではなく、ビューがレンダリングされる位置だけを移動させることがわかりました。これはまた、.animate().translationX()を使用した後も、onclickイベントがレイアウトを "移動"する前と同じ位置でトリガされる理由を説明します。

今、アニメーションと組み合わせて実際のビューを希望の位置に移動する方法を見つける必要があります。任意のアイデアをどのように行うには?

編集3: 私は同様の問題を持つポストの多くを発見し、私が正しい場合、問題を解決するには、ObjectAnimator代わりの.animate().translationX()を使用しています。 onClickListenerは次のようになりますように、私は、私のコードでその部分を交換してみました:

b.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View view) { 
     if (isPushedToSide) { 
      //ll.animate().translationX(0); 
      ObjectAnimator.ofFloat(ll, "translationX", 0).setDuration(250).start(); 
      isPushedToSide = false; 
     }else { 
      //ll.animate().translationX(-450); 
      ObjectAnimator.ofFloat(ll, "translationX", -450).setDuration(250).start(); 
      isPushedToSide = true; 
     } 
    } 
}); 

llは、私がLorem ipsumテキストやButtonを含む、膨らませてきたのLinearLayoutです。 アニメーション自体は正常に動作しますが、同じように動作します。私はまだonClickListenerを発射するためにボタンの元の位置をクリックする必要があり、青色の領域はまだクリックできません。

編集4:

は、実際の位置を更新するために.invalidate()を使用するための提案をしようとしていました。しかし、それは動作しませんでした。私はそれが正しい使用されているかどうかはわかりません。

b.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View view) { 
     if (isPushedToSide) { 
      //ll.animate().translationX(0); 
      ObjectAnimator.ofFloat(ll, "translationX", 0).setDuration(250).start(); 
      ll.invalidate(); 
      isPushedToSide = false; 
     }else { 
      //ll.animate().translationX(-450); 
      ObjectAnimator.ofFloat(ll, "translationX", -450).setDuration(250).start(); 
      ll.invalidate(); 
      isPushedToSide = true; 
     } 
    } 
}); 

私もLayoutParamsのx値を変更し、うまく働いたwm.updateViewLayou(ll, updatedParameters)を、呼び出してみました。オーバーレイを100ピクセル右に移動すると、onClickListenerをトリガーする領域も100ピクセル右に移動します。問題は、私は実際の画面の境界内でオーバーレイを移動することができただけであり、必要なのはスクリーンから外すことです。負の値を結んだが、それもうまくいかなかった。

本質的に必要なのは、引き出しのナビゲーションですが、高さが限られています(少なくとも私が必要と考えるものです)。そういうふうに正しく働くものが得られるかどうか見てみましょう。

編集5:

ObjectAnimatorのアニメーション= ObjectAnimator.ofFloat(LL、「translationX:アニメーションが終了したときに.inflate()が呼び出されますが、それはまだ同じように動作するように

は私のコードを修正しました"、0).setDuration(250);

anim.addListener(new Animator.AnimatorListener() { 

    @Override 
    public void onAnimationStart(Animator animator) {} 

    @Override 
    public void onAnimationEnd(Animator animator) { 
     b.invalidate(); 
     text.invalidate(); 
     frame.invalidate(); 
     ll.invalidate(); 
    } 

    @Override 
    public void onAnimationCancel(Animator animator) {} 

    @Override 
    public void onAnimationRepeat(Animator animator) {} 
}); 
anim.start(); 

また、問題を示す2つの.gifが記録されました。私はgravityCENTERに設定しました。 enter image description here enter image description here

答えて

0

に役立ちます願っています。ここで

はコードです:

public class Fw extends Service { 

    private WindowManager wm; 
    private boolean isPushedToSide = true; 


    @Nullable 
    @Override 
    public IBinder onBind(Intent intent) { 
     return null; 
    } 

    WindowManager.LayoutParams parameters; 
    Button b; 
    View inflating_layout; 
    LayoutInflater li; 
    ValueAnimator animator; 

    @Override 

    public void onCreate() { 
     super.onCreate(); 

     wm = (WindowManager) getSystemService(WINDOW_SERVICE); 

     li = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE); 
     inflating_layout = li.inflate(R.layout.overlay, null); 

     b = (Button) inflating_layout.findViewById(R.id.button); 

     parameters = new WindowManager.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.TYPE_PHONE, WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS, PixelFormat.TRANSLUCENT); 
     parameters.gravity = Gravity.LEFT | Gravity.TOP; 

     isPushedToSide = true; 

     b.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View view) { 
       if (isPushedToSide) { 

        isPushedToSide = false; 

        animator = ValueAnimator.ofInt(parameters.x, parameters.x-450); 
        animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { 
         @Override 
         public void onAnimationUpdate(ValueAnimator valueAnimator) { 
          int val = (Integer) valueAnimator.getAnimatedValue(); 
          updateView(inflating_layout, val); 

         } 
        }); 
        animator.setDuration(250); 
        animator.start(); 

       } else { 

        animator = ValueAnimator.ofInt(parameters.x, parameters.x+450); 
        animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { 
         @Override 
         public void onAnimationUpdate(ValueAnimator valueAnimator) { 
          int val = (Integer) valueAnimator.getAnimatedValue(); 
          updateView(inflating_layout, val); 

         } 
        }); 
        animator.setDuration(250); 
        animator.start(); 


        isPushedToSide = true; 
       } 
      } 
     }); 
     wm.addView(inflating_layout, parameters); 
    } 

    public void updateView(View view, Integer x) { 
     if (view != null) { 
      if (x != null) parameters.x = x; 
      wm.updateViewLayout(view, parameters); 
     } 
    } 
} 

は今、すべてが正常に動作するようです。スライディングアニメーションだけが画面の境界で少しちらつきます。より遅い速度、例えば、 .setDuration(2500)は発生しません。私はそれがエミュレータか別の理由のためかどうかわかりません。

0

は、私は、プロパティを変更するアニメーション「幅」の代わりに、あなたのレイアウトを変換している問題を解決する簡単な方法だと思います。

は、それは私が、私は、このようなSYSTEM_ALERT_WINDOWウィンドウを作成するために使用するガイドの作成者を尋ね、彼が私を助け

+0

しかし、その方法ではまだレイアウトのすべてのコンテンツが表示されず、新しい幅に合わせて一緒に押しつぶされますか? – 0x1234

+0

はい、それはあなたのレイアウトのサイズを変更します、あなたはexectlyあなたのレイアウトの一部を非表示にする必要がありますか?コードのスニペットを表示できますか?アニメーションの部分 – dosssik

+0

はい、後でコンテンツを追加したときに、幅プロパティを変更するだけでよく見えません。私は後で開始ポストに自分のコードを追加します。 – 0x1234

関連する問題