Android仿Qzone下部ナビゲーションバープラスポップアップメニュー

3548 ワード

最近QQ空间新浪微博....多くのアプリケーションの下部のナビゲーションバーにはプラス記号が付いてポップアップメニューをクリックして、demoを書いて、この機能をしたことがない友达に参考にして、みんなに役に立つことを望んで、demoの中の画像はすべてQzoneから来てただ学習交流として使用します.
まず効果を見てみましょう(gif図は携帯電話の画面がパソコンに投影されて録画された効果があまりよくなく、携帯電話でスムーズです)
一、分析
この効果を達成するには、まず、半透明のpopupWindow(または他の実装方法)(1)popupWindowのlayoutレイヤレイアウトに半透明の背景を加える必要があります.
android:background="#e0ffffff"

(2)popupWindowをPopupMenuUtilというツールクラスにカプセル化し,activityではナビゲーションバーに番号を付けたクリックイベントに呼び出しを加えるだけでよい他はpopupWindowに任せて処理する
@Override
public void onClick(View v) {    
PopupMenuUtil.getInstance()._show(context, ivImg);
}

(3)popupWindowにはナビゲーションバーと同じプラス記号が必要で、弾いたときに上書きし、弾いたときにpopupwindowのプラス記号画像135度の回転を実行し、すべてのメニューが画面の一番下から属性アニメーションで平行移動します.
二、キーコード
(1)popupWindowが弾けたときにプラス記号で実行されるアニメーション
ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(ivBtn, "rotation", 0f, 135f);
objectAnimator.setDuration(200);
objectAnimator.start();

(2)各menuが実行するアニメーション方法
 /* *     
    *    @param view     view 
    *    @param duration      
    *    @param distance        
    */
private void _startAnimation(View view, int duration, float[] distance) {  
ObjectAnimator anim = ObjectAnimator.ofFloat(view, "translationY", distance); 
anim.setDuration(duration);    
anim.start();
}

distanceはプロパティアニメーションを実行する配列です
new float[]{bottom, 60, -30, -20 - 10, 0}; //bottom          

アニメーションを実行する順序の配列は同じで、時間が異なるとメニューの平行移動の視覚差効果を実現できます.
(3)同様にpopupwindowがオフの場合はプラスボタンも反時計回りに135度回転するアニメーションメニューも最後まで移動する必要があります
/** 
   *   popupWindow      
   */
public void _rlClickAction() {   
      if (ivBtn != null && rlClick != null) {
          ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(ivBtn, "rotation", 135f, 0f);        
          objectAnimator.setDuration(300);       
          objectAnimator.start();       
         _closeAnimation(llTest1, 300, top);        
         _closeAnimation(llTest2, 200, top);        
         _closeAnimation(llTest3, 200, top);       
         _closeAnimation(llTest4, 300, top);       
         _closeAnimation(llTest5, 300, bottom);       
         _closeAnimation(llTest6, 200, bottom);       
         _closeAnimation(llTest7, 200, bottom);        
         _closeAnimation(llTest8, 300, bottom);       
         rlClick.postDelayed(new Runnable() { 
              @Override            
              public void run() {               
                     _close();           
              }       
         }, 300);   
      }
}

(1)popupWindowは300ミリ秒遅れて閉じる(つまりすべてのアニメーションが実行された)必要があります.そうしないと、すぐに閉じるとアニメーション効果が見えません.(2)activityでリターンキーを傍受する必要があります.そうしないとpopupWindowが弾けても、アニメーションのクローズ効果は見えません.
@Override  
public void onBackPressed() {    
//  popupWindow                 popupWindow     activity   
           if (PopupMenuUtil.getInstance()._isShowing()) {      
              PopupMenuUtil.getInstance()._rlClickAction();    
           } else {        
           super.onBackPressed();   
           }
}

Activityにおけるリスニング戻りキーの応答はpopupWindowが実行クローズメソッドが表示されている場合はfinish()メソッドを直接実行しているかどうかを判断する
効果を見るためにメインインタフェースにqzoneを模した簡単なリストが書かれています.必要でなければ、このクラスのPopupMenuUtilを直接見ることができます.
github demoアドレス csdn demoアドレス