Android DecorViewの使用

5221 ワード

今日はandroidの

DecorViewの使用.
getWindow().getDecorView()のメソッドはdecorViewを取得できますが、decorViewとは何ですか?decorViewはwindowの最上位レベルのviewで、windowからdecorViewを取得できます.その後、decorViewにはgetWindowVisibleDisplayFrameメソッドがあり、タイトルバーを含むプログラム表示の領域を取得できますが、ステータスバーは含まれません.
  Rect rect = new Rect();  
            /* 
             * getWindow().getDecorView()   View Window     View,   Window     View, 
             *    View  getWindowVisibleDisplayFrame()              , 
             *      ,       。 
             */  
            getWindow().getDecorView().getWindowVisibleDisplayFrame(rect); 

             1.       :  
                   ,      rect             
             int statusBarHeight = rect.top; 
             
             2.       : 
             getWindow().findViewById(Window.ID_ANDROID_CONTENT); 
                    View            ,                 。 
             int contentTop = getWindow().findViewById(Window.ID_ANDROID_CONTENT).getTop();    
             //statusBarHeight                
             int titleBarHeight = contentTop - statusBarHeight   
              

次に、具体的な例を示します.
まず実現した効果を見てみましょう
実現の大まかな考え方
  • まずDecorViewとは何かを理解する必要があります.彼はandroidのインタフェースのルートレイアウトです.実はandroidのactivityインタフェースは全体的にコントロールツリーで、DecorViewはルートノードで、DecorViewの子供ノードはLinearLayoutで、このLinearLayoutの子供系ノードはステータスバー+と私たちが書いたレイアウト
  • を含む.
  • DecorViewは、FramLayoutのサブクラス(ソースコードから見られる)
  • です.
  • DecorViewがルートノードであり、かつFrameLayoutである以上、私たち自身のレイアウトをDecorViewに追加したり、DecorViewから削除したりすることで、Dialogの効果をシミュレートすることができます~~、もちろんこのDialogのスタイルで、アニメーションは自分で書きたいように書くことができます撒
  • はactivityを通過する.getWindow().getDecorView()は、DecorView
  • を取得できます.
    [次の大量のコード]
    最初のダイアログの実装
    public class TipsDialog {
      private Activity activity;
      private View rootView;
      private TextView confirmTextView;
      private TextView cancelTextView;
      private TextView contentTextView;
     
      private boolean isShowing;
     
      public TipsDialog(Activity activity) {
        this.activity = activity;
        isShowing = false;
        rootView = LayoutInflater.from(activity).inflate(R.layout.view_tips_dialog,null);
        confirmTextView = (TextView) rootView.findViewById(R.id.view_tips_dialog_tv_confirm);
        cancelTextView = (TextView) rootView.findViewById(R.id.view_tips_dialog_tv_cancel);
        contentTextView = (TextView) rootView.findViewById(R.id.view_tips_dialog_tv_content);
     
      }
     
      public void show(){
        if(activity == null){
          return;
        }
        if(isShowing){
          return;
        }
        ViewGroup decorView = (ViewGroup) activity.getWindow().getDecorView();
        FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
        params.gravity = Gravity.CENTER;
        rootView.setLayoutParams(params);
        decorView.addView(rootView);
        rootView.setOnClickListener(new View.OnClickListener() {
          @Override
          public void onClick(View v) {
            dismiss();
          }
        });
     
        RotateAnimation rotateAnimation = new RotateAnimation(0,720f,RotateAnimation.RELATIVE_TO_SELF,0.5f,RotateAnimation.RELATIVE_TO_SELF,0.5f);
        rotateAnimation.setDuration(2000);
        contentTextView.startAnimation(rotateAnimation);
     
        isShowing = true;
      }
     
      public void dismiss(){
        if(!isShowing){
          return;
        }
        isShowing = false;
        if(rootView.getParent() == null){
          return;
        }
        ViewGroup parent = (ViewGroup) rootView.getParent();
        parent.removeView(rootView);
     
      }
     
      public int getRandomColor(){
        Random random = new Random();
        return Color.argb(random.nextInt(200),random.nextInt(240),random.nextInt(240),random.nextInt(240));
      }
     
      public boolean isShowing() {
        return isShowing;
      }
    }
    

    実はショーの時にレイアウトをDecorViewの上に追加して、dismissの時にレイアウトをDecorViewの上から削除します
    ヒントの実装(処理が完備していない~~ただの説明ハDecorView)
    public class TopTipDialog {
      private Activity activity;
      private View rootView;
      private boolean isShowing;
      private static final int VIEW_HEIGHT = 64;//px
     
      public TopTipDialog(Activity activity) {
        this.activity = activity;
        rootView = LayoutInflater.from(activity).inflate(R.layout.view_top_tip_dialog,null);
      }
     
     
      public void show(){
     
        if(isShowing){
          return;
        }
        ViewGroup decorView = (ViewGroup) activity.getWindow().getDecorView();
        FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, VIEW_HEIGHT);
        params.gravity = Gravity.TOP;
        params.setMargins(0,0,0,-VIEW_HEIGHT);
        rootView.setLayoutParams(params);
     
        TranslateAnimation translateAnimation = new TranslateAnimation(0,0,-VIEW_HEIGHT,0);
        translateAnimation.setDuration(1500);
        translateAnimation.setFillAfter(true);
        decorView.addView(rootView);
        rootView.startAnimation(translateAnimation);
     
        rootView.postDelayed(new Runnable() {
          @Override
          public void run() {
            TranslateAnimation translateAnimation1 = new TranslateAnimation(0,0,0,-VIEW_HEIGHT);
            translateAnimation1.setDuration(1500);
            translateAnimation1.setFillAfter(true);
            rootView.startAnimation(translateAnimation1);
          }
        },3000);
     
      }
    }
    

    Android DecorViewの使用は終わりました.
    簡単です.