PopupWindow實現(xiàn)右側(cè)讯榕、左側(cè)和底部彈出菜單

先上圖,4張:

圖1


圖2
圖3
圖4

項目代碼:http://download.csdn.net/download/jianfengwen/9124745 (需要2個分)


貼代碼:

MainActivity類:

package com.example.popupleftmenu;

import android.app.Activity;

import android.content.Context;

import android.graphics.drawable.ColorDrawable;

import android.os.Bundle;

import android.view.Gravity;

import android.view.MotionEvent;

import android.view.View;

import android.view.View.OnClickListener;

import android.view.View.OnTouchListener;

import android.view.ViewGroup.LayoutParams;

import android.view.WindowManager;

import android.widget.Button;

import android.widget.PopupWindow;

import android.widget.Toast;

public ?class ?MainActivity ?extends ?Activity?{

private Context?context?=null;

private PopupWindow ?popupWindow;

private int from?=0;

@Override

protected void onCreate(Bundle ?savedInstanceState)?{

super.onCreate(savedInstanceState);

context?=this;

setContentView(R.layout.activity_main);

Button?popLeftBtn?=?(Button)findViewById(R.id.pop_left_btn);

Button?popRightBtn?=?(Button)findViewById(R.id.pop_right_btn);

Button?popBottomBtn?=?(Button)findViewById(R.id.pop_bottom_btn);

popLeftBtn.setOnClickListener(popClick);

popRightBtn.setOnClickListener(popClick);

popBottomBtn.setOnClickListener(popClick);

}

OnClickListener?popClick?=new OnClickListener()?{

@Override

public ?void ?onClick(View ?v)?{

switch(v.getId()){

case ?R.id.pop_left_btn:

{

from?=?Location.LEFT.ordinal();

break;

}

case ?R.id.pop_right_btn:

{

from?=?Location.RIGHT.ordinal();

break;

}

case ?R.id.pop_bottom_btn:

{

from?=?Location.BOTTOM.ordinal();

break;

}

}

//調(diào)用此方法,menu不會置頂

//popupWindow.showAsDropDown(v);

initPopupWindow();

}

};

/**

*?添加新筆記時彈出的popWin關(guān)閉的事件饶火,主要是為了將背景透明度改回來

*

*/

class popupDismissListener implements PopupWindow.OnDismissListener{

@Override

public void onDismiss()?{

backgroundAlpha(1f);

}

}

protected void initPopupWindow() {

View?popupWindowView?=?getLayoutInflater().inflate(R.layout.pop,null);

//內(nèi)容至壤,高度威始,寬度

if(Location.BOTTOM.ordinal()?==?from){

popupWindow?=new PopupWindow(popupWindowView,?LayoutParams.FILL_PARENT,?LayoutParams.WRAP_CONTENT,true);

}else{

popupWindow?=new PopupWindow(popupWindowView,?LayoutParams.WRAP_CONTENT,?LayoutParams.FILL_PARENT,true);

}

//動畫效果

if(Location.LEFT.ordinal()?==?from){

popupWindow.setAnimationStyle(R.style.AnimationLeftFade);

} else if(Location.RIGHT.ordinal()?==?from){

popupWindow.setAnimationStyle(R.style.AnimationRightFade);

} else if(Location.BOTTOM.ordinal()?==?from){

popupWindow.setAnimationStyle(R.style.AnimationBottomFade);

}

//菜單背景色

ColorDrawable?dw?=new ColorDrawable(0xffffffff);

popupWindow.setBackgroundDrawable(dw);

//寬度

//popupWindow.setWidth(LayoutParams.WRAP_CONTENT);

//高度

//popupWindow.setHeight(LayoutParams.FILL_PARENT);

//顯示位置

if(Location.LEFT.ordinal()?==?from){

popupWindow.showAtLocation(getLayoutInflater().inflate(R.layout.activity_main,null),?Gravity.LEFT,0,500);

}elseif(Location.RIGHT.ordinal()?==?from){

popupWindow.showAtLocation(getLayoutInflater().inflate(R.layout.activity_main,null),?Gravity.RIGHT,0,500);

}elseif(Location.BOTTOM.ordinal()?==?from){

popupWindow.showAtLocation(getLayoutInflater().inflate(R.layout.activity_main,null),?Gravity.BOTTOM|Gravity.CENTER_HORIZONTAL,0,0);

}

//設(shè)置背景半透明

backgroundAlpha(0.5f);

//關(guān)閉事件

popupWindow.setOnDismissListener(new popupDismissListener());

popupWindowView.setOnTouchListener(new OnTouchListener()?{

@Override

public boolean onTouch(View?v,?MotionEvent?event)?{

/*if(?popupWindow!=null?&&?popupWindow.isShowing()){

popupWindow.dismiss();

popupWindow=null;

}*/

//?這里如果返回true的話,touch事件將被攔截

//?攔截后?PopupWindow的onTouchEvent不被調(diào)用像街,這樣點擊外部區(qū)域無法dismiss

return false;

}

});

Button?open?=?(Button)popupWindowView.findViewById(R.id.open);

Button?save?=?(Button)popupWindowView.findViewById(R.id.save);

Button?close?=?(Button)popupWindowView.findViewById(R.id.close);

open.setOnClickListener(new OnClickListener()?{

@Override

public void onClick(View?v)?{

Toast.makeText(context,"Open",?Toast.LENGTH_LONG).show();

popupWindow.dismiss();

}

});

save.setOnClickListener(newOnClickListener()?{

@Override

public void onClick(View ?v)?{

Toast.makeText(context,"Open",?Toast.LENGTH_LONG).show();

popupWindow.dismiss();

}

});

close.setOnClickListener(new OnClickListener()?{

@Override

public void onClick(View?v)?{

Toast.makeText(context,"Open",?Toast.LENGTH_LONG).show();

popupWindow.dismiss();

}

});

}

/**

*?設(shè)置添加屏幕的背景透明度

*?@param?bgAlpha

*/

publicvoid backgroundAlpha(float bgAlpha)

{

WindowManager.LayoutParams?lp?=?getWindow().getAttributes();

lp.alpha?=?bgAlpha;//0.0-1.0

getWindow().setAttributes(lp);

}

/**

*?菜單彈出方向

*

*/

public enum Location?{

LEFT,

RIGHT,

TOP,

BOTTOM;

}

}

兩個布局文件:

1.activity_main.xml黎棠,就三個Button

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" ?

? ? xmlns:tools="http://schemas.android.com/tools" ?

? ? android:layout_width="fill_parent" ?

? ? android:layout_height="fill_parent" ?

? ? android:orientation="vertical"> ?

? ??<Button ??

? ? ? ? android:id="@+id/pop_left_btn" ?

? ? ? ? android:layout_width="fill_parent" ?

? ? ? ? android:layout_height="wrap_content" ?

? ? ? ? android:text="@string/pop_left"/> ?

? ? <Button ??

? ? ? ? android:id="@+id/pop_right_btn" ?

? ? ? ? android:layout_width="fill_parent" ?

? ? ? ? android:layout_height="wrap_content" ?

? ? ? ? android:text="@string/pop_right"/> ?

? ? <Button ??

? ? ? ? android:id="@+id/pop_bottom_btn" ?

? ? ? ? android:layout_width="fill_parent" ?

? ? ? ? android:layout_height="wrap_content" ?

? ? ? ? android:text="@string/pop_bottom"/> ?

</LinearLayout> ?

2. pop.xml,也是三個Button镰绎,可以自己修改

<?xml version="1.0" encoding="utf-8"?> ?

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" ?

? ? android:layout_width="fill_parent" ?

? ? android:layout_height="fill_parent" ?

? ? android:orientation="vertical" > ?

? ? <!-- <LinearLayout ??

? ? ? ? android:layout_width="wrap_content" ?

? ? ? ? android:layout_height="fill_parent" ?

? ? ? ? android:orientation="vertical" ?

? ? ? ? android:background="#ffffff"> --> ?

? ? ? ? <Button android:id="@+id/open" ?

? ? ? ? ? ? android:layout_width="fill_parent" ?

? ? ? ? ? ? android:layout_height="wrap_content" ?

? ? ? ? ? ? android:text="@string/open"/> ?

? ? ? ? <Button android:id="@+id/save" ?

? ? ? ? ? ? android:layout_width="fill_parent" ?

? ? ? ? ? ? android:layout_height="wrap_content" ?

? ? ? ? ? ? android:text="@string/save"/> ?

? ? ? ? <Button android:id="@+id/close" ?

? ? ? ? ? ? android:layout_width="fill_parent" ?

? ? ? ? ? ? android:layout_height="wrap_content" ?

? ? ? ? ? ? android:text="@string/close"/> ?

? ?<!-- ?</LinearLayout> --> ?

</LinearLayout> ?


strings.xml

<string name="pop_left">彈出左側(cè)菜單</string> ?

<string name="pop_right">彈出右側(cè)菜單</string> ?

<string name="pop_bottom">彈出底部菜單</string> ?

<string name="open">打開</string> ??

<string name="save">保存</string> ??

<string name="close">關(guān)閉</string> ??

styles.xml

<style name="AnimationLeftFade"> ?

? ? ? ? <item name="android:windowEnterAnimation">@anim/in_lefttoright</item> ?

? ? ? ? <item name="android:windowExitAnimation">@anim/out_righttoleft</item> ?

?</style> ?

<style name="AnimationRightFade"> ?

? ? ? ? <item name="android:windowEnterAnimation">@anim/in_righttoleft</item> ?

? ? ? ? <item name="android:windowExitAnimation">@anim/out_lefttoright</item> ?

</style> ?

<style name="AnimationBottomFade"> ?

? ? ? ? <item name="android:windowEnterAnimation">@anim/in_bottomtotop</item> ?

? ? ? ? <item name="android:windowExitAnimation">@anim/out_toptobottom</item> ?

</style> ?


左邊彈出菜單動畫文件:

in_lefttoright.xml:從左邊入

<?xml version="1.0" encoding="utf-8"?> ?

<set xmlns:android="http://schemas.android.com/apk/res/android"> ?

? ? <translate ??

? ? ? ? android:fromXDelta="-100%" ?

? ? ? ? android:toXDelta="0" ?

? ? ? ? android:duration="500"/> ?

</set> ?

out_righttoleft.xml:從右邊出

<?xml version="1.0" encoding="utf-8"?> ?

<set xmlns:android="http://schemas.android.com/apk/res/android"> ?


? ? <translate

? ? ? ? android:fromXDelta="0" ?

? ? ? ? android:toXDelta="-100%" ?

? ? ? ? android:duration="500"/> ?

</set> ?

其他動畫文件自己參考寫脓斩,就是fromXDelta, fromYDelta畴栖, toXDelta和toYDelta使用

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末随静,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子吗讶,更是在濱河造成了極大的恐慌燎猛,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,029評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件照皆,死亡現(xiàn)場離奇詭異重绷,居然都是意外死亡,警方通過查閱死者的電腦和手機膜毁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,395評論 3 385
  • 文/潘曉璐 我一進(jìn)店門昭卓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來愤钾,“玉大人,你說我怎么就攤上這事候醒∧馨洌” “怎么了?”我有些...
    開封第一講書人閱讀 157,570評論 0 348
  • 文/不壞的土叔 我叫張陵火焰,是天一觀的道長劲装。 經(jīng)常有香客問我,道長昌简,這世上最難降的妖魔是什么占业? 我笑而不...
    開封第一講書人閱讀 56,535評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮纯赎,結(jié)果婚禮上谦疾,老公的妹妹穿的比我還像新娘。我一直安慰自己犬金,他們只是感情好念恍,可當(dāng)我...
    茶點故事閱讀 65,650評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著晚顷,像睡著了一般峰伙。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上该默,一...
    開封第一講書人閱讀 49,850評論 1 290
  • 那天瞳氓,我揣著相機與錄音,去河邊找鬼栓袖。 笑死匣摘,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的裹刮。 我是一名探鬼主播音榜,決...
    沈念sama閱讀 39,006評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼捧弃!你這毒婦竟也來了赠叼?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,747評論 0 268
  • 序言:老撾萬榮一對情侶失蹤塔橡,失蹤者是張志新(化名)和其女友劉穎梅割,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體葛家,經(jīng)...
    沈念sama閱讀 44,207評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡户辞,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,536評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了癞谒。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片底燎。...
    茶點故事閱讀 38,683評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡刃榨,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出双仍,到底是詐尸還是另有隱情枢希,我是刑警寧澤,帶...
    沈念sama閱讀 34,342評論 4 330
  • 正文 年R本政府宣布朱沃,位于F島的核電站苞轿,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏逗物。R本人自食惡果不足惜搬卒,卻給世界環(huán)境...
    茶點故事閱讀 39,964評論 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望翎卓。 院中可真熱鬧契邀,春花似錦、人聲如沸失暴。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,772評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽逗扒。三九已至古戴,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間矩肩,已是汗流浹背允瞧。 一陣腳步聲響...
    開封第一講書人閱讀 32,004評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留蛮拔,地道東北人。 一個月前我還...
    沈念sama閱讀 46,401評論 2 360
  • 正文 我出身青樓痹升,卻偏偏與公主長得像建炫,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子疼蛾,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,566評論 2 349

推薦閱讀更多精彩內(nèi)容