2015-11-09 7 views
5

私のサービスがすべてのアプリケーションの上にビューを追加するカスタムアンドロイドビルドを行っています。次のコードを使用してください:ビューと共にAndroidウィンドウをアニメーション化

WindowManager mWM = (WindowManager)mContext.getSystemService(Context.WINDOW_SERVICE); 
LayoutInflater inflater = (LayoutInflater)mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);WindowManager.LayoutParams mParams = new WindowManager.LayoutParams(); 
mParams = new WindowManager.LayoutParams(
       WindowManager.LayoutParams.TYPE_PHONE, 
       WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL| WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, 
       PixelFormat.TRANSLUCENT); 
mParams.height = 117; 
mParams.width = 366; 
View myView = inflater.inflate(R.layout.myView,null); 
mWM.addView(myView, mParams); 

ビューを正常に追加できます。

PropertyValuesHolder pvhX = PropertyValuesHolder.ofFloat("x", 300); 
ObjectAnimator.ofPropertyValuesHolder(myView, pvhX).start(); 

私はビューをアニメーション表示していますが、ウィンドウは表示されません。ビューが使用されていた透過ウィンドウがアニメーション化されていません。 Android Property Animation

ビューアニメーションシステムのもう一つの欠点は、実際のビュー自体ではなくビューが描画された場所のみが変更されていることです。たとえば、ボタンをアニメーション化して画面を移動すると、ボタンが正しく描画されますが、ボタンをクリックできる実際の位置は変更されないため、これを処理する独自のロジックを実装する必要があります。

ビューと一緒にウィンドウをアニメーション化するにはどうすればよいですか?

おかげ

+0

は、あなたの 'myView'のレイアウトはどのようなものが見えますか? – tachyonflux

答えて

1

あなたのウィンドウは、ウィンドウのparamsからの高さと幅を除去することにより、画面全体を埋めるように、あなたはそれを作ることができます。ビューのサイズを制御する場合は、代わりにレイアウトで設定します。


そうしないと、あなたはValueAnimatorを使用することができますし、繰り返し呼び出すWindowManagerさんupdateViewLayout

ValueAnimator va = ValueAnimator.ofInt(mParams.x, 300); 
va.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { 
    public void onAnimationUpdate(ValueAnimator animation) { 
     Integer value = (Integer) animation.getAnimatedValue(); 
     mParams.x = value.intValue(); 
     mWM.updateViewLayout(myView, mParams); 
    } 
}); 
2

あなたはこれを達成するには、2つのオプションを持っている(とコヒーレントユーザのタッチフィードバックを維持しViewの位置) :

  1. は、透明容器を作成FrameLayoutのように)あなたのViewとそのアニメーションオフセット(あなたのケースでは、高さが366 + 300px)を含むのに十分な大きさです。このようにして、コンテナをWindowに追加し、Viewはコンテナの内部に残り、アニメーション/トランスラートすることができます。

  2. 画面上のビューの絶対位置をに移動し、カスタムアニメーションの種類を作成します。 ValueAnimatorを使用してmParams.xの値を動的に設定するか、Reboundライブラリを使用してバネ効果を使用する必要がある場合は、さらにバウンスを必要とするだけです。私はあなたに最後の1つをお勧めします、それは本当に素晴らしいです!

ここでリバウンドを使用して(未テスト)の例です:

SpringSystem springSystem = SpringSystem.create(); 
Spring spring = springSystem.createSpring(); 
final int originalPos = mParams.x; 
final int offset = 300; 
spring.addListener(new SimpleSpringListener() { 

    @Override 
    public void onSpringUpdate(Spring spring) { 
    float value = (float) spring.getCurrentValue(); 
    mParams.x = originalPos + ((int) value*offset) 
    mWM.updateViewLayout(myView, mParams); 
    } 
}); 
spring.setEndValue(1); 

あなたが最初にあなたの依存関係の回復のコンパイル文を追加する必要があることを忘れないでください:

// Gradle dependency on Rebound 
dependencies { 
    compile 'com.facebook.rebound:rebound:0.3.8' 
} 
1

はこれをしてくださいしてみてください。

WindowManager mWM = (WindowManager)mContext.getSystemService(Context.WINDOW_SERVICE); 
LayoutInflater inflater = (LayoutInflater)mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);WindowManager.LayoutParams mParams = new WindowManager.LayoutParams(); 
mParams = new WindowManager.LayoutParams(
       WindowManager.LayoutParams.MATCH_PARENT, 
       WindowManager.LayoutParams.MATCH_PARENT, 
       WindowManager.LayoutParams.TYPE_PHONE, 
       WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL| WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, 
       PixelFormat.TRANSLUCENT); 
mParams.gravity = Gravity.TOP | Gravity.LEFT; 
mParams.x = 0; 
mParams.y = 0; 

View myView = inflater.inflate(R.layout.myView,null); 
LinearLayout parent = new LinearLayout(context); 
parent.addView(myView, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT)); 
mWM.addView(parent, mParams); 

そして、あなたは

PropertyValuesHolder pvhX = PropertyValuesHolder.ofFloat("x", 300); 
ObjectAnimator.ofPropertyValuesHolder(myView, pvhX).start(); 
をしたとして、アニメーションのMYVIEWを保つあなたのXMLファイル内のビューの幅&高さを設定 に対する通知 - R.layout.myView

関連する問題