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)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,431評論 6 544
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,637評論 3 429
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,555評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,900評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 72,629評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,976評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,976評論 3 448
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 43,139評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,686評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 41,411評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,641評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,129評論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,820評論 3 350
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,233評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,567評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,362評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 48,604評論 2 380

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