巧用DecorView實現(xiàn)對話框

如果還不知道DecorView,那也沒有什么關系 _


先來看看實現(xiàn)的效果

模仿了一個對話框
從屏幕頂部出來一個提示消息

實現(xiàn)的大致思路

  • 首先需要明白什么是DecorView揽涮,他是android中界面的根布局。其實android的activity界面整個就是一個控件樹,DecorView是根節(jié)點桦卒,DecorView的孩子節(jié)點就是一個LinearLayout,這個LinearLayout的孩子系節(jié)點就包括狀態(tài)欄 + 和我們自己寫的布局

  • DecorView是FramLayout的子類(可以從源碼中看到)

  • 既然DecorView是根節(jié)點匿又,而且還是FrameLayout方灾,所以我們可以把我們自己的布局 添加到DecorView 或者 從DecorView移除,這樣就模擬出了一個Dialog的效果~~ ,當然這個Dialog的樣式裕偿,動畫就可以自己想怎么寫就怎么寫了撒

  • 通過activity.getWindow().getDecorView()可以獲得DecorView


[下面大量 代碼 ]


第一個對話框的實現(xiàn)

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;
    }
}
  • 其實就是show的時候將布局添加到DecorView上面去洞慎,dismiss的時候將布局從DecorView上面移除

提示的實現(xiàn)(沒有處理完善~~ 僅僅就是說明哈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);

    }
}

Nothing is certain in this life. The only thing i know for sure is that. I love you and my life. That is the only thing i know. have a good day

:)

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市嘿棘,隨后出現(xiàn)的幾起案子劲腿,更是在濱河造成了極大的恐慌,老刑警劉巖鸟妙,帶你破解...
    沈念sama閱讀 218,858評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件焦人,死亡現(xiàn)場離奇詭異,居然都是意外死亡重父,警方通過查閱死者的電腦和手機花椭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來房午,“玉大人矿辽,你說我怎么就攤上這事⊥嵛郑” “怎么了嗦锐?”我有些...
    開封第一講書人閱讀 165,282評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長沪曙。 經(jīng)常有香客問我奕污,道長,這世上最難降的妖魔是什么液走? 我笑而不...
    開封第一講書人閱讀 58,842評論 1 295
  • 正文 為了忘掉前任碳默,我火速辦了婚禮,結果婚禮上缘眶,老公的妹妹穿的比我還像新娘嘱根。我一直安慰自己,他們只是感情好巷懈,可當我...
    茶點故事閱讀 67,857評論 6 392
  • 文/花漫 我一把揭開白布该抒。 她就那樣靜靜地躺著,像睡著了一般顶燕。 火紅的嫁衣襯著肌膚如雪凑保。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,679評論 1 305
  • 那天涌攻,我揣著相機與錄音欧引,去河邊找鬼。 笑死恳谎,一個胖子當著我的面吹牛芝此,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 40,406評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼婚苹,長吁一口氣:“原來是場噩夢啊……” “哼岸更!你這毒婦竟也來了?” 一聲冷哼從身側響起租副,我...
    開封第一講書人閱讀 39,311評論 0 276
  • 序言:老撾萬榮一對情侶失蹤坐慰,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后用僧,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,767評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡赞咙,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年责循,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片攀操。...
    茶點故事閱讀 40,090評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡院仿,死狀恐怖,靈堂內的尸體忽然破棺而出速和,到底是詐尸還是另有隱情歹垫,我是刑警寧澤,帶...
    沈念sama閱讀 35,785評論 5 346
  • 正文 年R本政府宣布颠放,位于F島的核電站排惨,受9級特大地震影響,放射性物質發(fā)生泄漏碰凶。R本人自食惡果不足惜暮芭,卻給世界環(huán)境...
    茶點故事閱讀 41,420評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望欲低。 院中可真熱鬧辕宏,春花似錦、人聲如沸砾莱。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽腊瑟。三九已至聚假,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間扫步,已是汗流浹背魔策。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留河胎,地道東北人闯袒。 一個月前我還...
    沈念sama閱讀 48,298評論 3 372
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親政敢。 傳聞我的和親對象是個殘疾皇子其徙,可洞房花燭夜當晚...
    茶點故事閱讀 45,033評論 2 355

推薦閱讀更多精彩內容