利用继承PopupWindow,自定义类实现弹出菜单并为弹出菜单添加动画效果。
自定义PopupMenu继承PopupWindow:
import android.app.Activity;
import android.content.Context;
import android.graphics.drawable.ColorDrawable;
import android.view.Display;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.LinearLayout.LayoutParams;
import android.widget.PopupWindow;
import android.widget.TextView;
public class PopupMenu extends PopupWindow implements OnClickListener {
private Activity activity;
private View popView;
private int mWidth;
private int mHeight;
private View v_item1;
private View v_item2;
private View v_item3;
private OnItemClickListener onItemClickListener;
/**
*
* 枚举,选择选项标识
*/
public enum MENUITEM {
ITEM1, ITEM2, ITEM3
}
private String[] tabs;
public PopupMenu(Activity activity ,String[] tabs) {
super(activity);
this.activity = activity;
this.tabs = tabs;
Display display = activity.getWindowManager().getDefaultDisplay();
mWidth = display.getWidth();
mHeight = display.getHeight();
LayoutInflater inflater = (LayoutInflater) activity
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
popView = inflater.inflate(R.layout.popup_menu, null);// 加载菜单布局文件
this.setContentView(popView);// 把布局文件添加到popupwindow中
this.setWidth(mWidth*4/5);// 设置菜单的宽度(需要和菜单于右边距的距离搭配,可以自己调到合适的位置)
this.setHeight(LayoutParams.MATCH_PARENT);
this.setFocusable(true);// 获取焦点
this.setTouchable(true); // 设置PopupWindow可触摸
this.setOutsideTouchable(true); // 设置非PopupWindow区域可触摸
this.setAnimationStyle(R.style.popupAnimation);
ColorDrawable dw = new ColorDrawable(0x00000000);
this.setBackgroundDrawable(dw);
// 获取选项卡
v_item1 = popView.findViewById(R.id.ly_item1);
v_item2 = popView.findViewById(R.id.ly_item2);
v_item3 = popView.findViewById(R.id.ly_item3);
// 添加监听
v_item1.setOnClickListener(this);
v_item2.setOnClickListener(this);
v_item3.setOnClickListener(this);
}
/**
* 设置显示的位置
*
* @param resourId
* 这里的x,y值自己调整可以
*/
public void showLocation(int resourId) {
showAsDropDown(activity.findViewById(resourId), dip2px(activity, 0),
dip2px(activity, -8));
}
@Override
public void onClick(View v) {
MENUITEM menuitem = null;
String str = "";
if (v == v_item1) {
menuitem = MENUITEM.ITEM1;
str = tabs[0];
TextView tvAboutUs = (TextView)v_item1.findViewById(R.id.tv_about_us);
tvAboutUs.setText(str);
} else if (v == v_item2) {
menuitem = MENUITEM.ITEM2;
str = tabs[1];
TextView tvAboutUs = (TextView)v_item2.findViewById(R.id.tv_check_update);
tvAboutUs.setText(str);
} else if (v == v_item3) {
menuitem = MENUITEM.ITEM3;
str = tabs[2];
TextView tvAboutUs = (TextView)v_item3.findViewById(R.id.tv_feedback);
tvAboutUs.setText(str);
}
if (onItemClickListener != null) {
onItemClickListener.onClick(menuitem, str);
}
dismiss();
}
// dip转换为px
public int dip2px(Context context, float dipValue) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (dipValue * scale + 0.5f);
}
// 点击监听接口
public interface OnItemClickListener {
void onClick(MENUITEM item, String str);
}
// 设置监听
public void setOnItemClickListener(OnItemClickListener onItemClickListener) {
this.onItemClickListener = onItemClickListener;
}
}
布局文件:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="100dp"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:background="#33000000"
android:orientation="vertical"
android:layout_gravity="center">
<LinearLayout
android:id="@+id/ly_item1"
android:layout_width="match_parent"
android:layout_height="45dip"
android:gravity="center_vertical"
android:orientation="horizontal"
android:background="@drawable/bg_default_button_selector">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="15sp"
android:paddingLeft="20dip"
android:id="@+id/tv_about_us"
android:textColor="#595d5f"
android:text="选项一" />
</LinearLayout>
<View
android:layout_width="match_parent"
android:layout_height="1dip"
android:background="#eeeeee" />
<LinearLayout
android:id="@+id/ly_item2"
android:layout_width="match_parent"
android:layout_height="45dip"
android:gravity="center_vertical"
android:orientation="horizontal"
android:background="@drawable/bg_default_button_selector">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingLeft="20dip"
android:paddingRight="20dip"
android:visibility="gone" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="15sp"
android:paddingLeft="20dip"
android:textColor="#595d5f"
android:id="@+id/tv_check_update"
android:text="选项二" />
</LinearLayout>
<View
android:layout_width="match_parent"
android:layout_height="1dip"
android:background="#eeeeee" />
<LinearLayout
android:id="@+id/ly_item3"
android:layout_width="match_parent"
android:layout_height="45dip"
android:gravity="center_vertical"
android:orientation="horizontal"
android:background="@drawable/bg_default_button_selector" >
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingLeft="20dip"
android:paddingRight="20dip"
android:visibility="gone" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="15sp"
android:paddingLeft="20dip"
android:textColor="#595d5f"
android:id="@+id/tv_feedback"
android:text="选项三" />
</LinearLayout>
</LinearLayout>
anim文件夹中定义动画文件:
in.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:duration="500"
android:fromXDelta="-100%"
android:toXDelta="0" />
<alpha
android:duration="500"
android:fromAlpha="0.0"
android:toAlpha="1.0" />
</set>
out.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:duration="500"
android:fromXDelta="0"
android:toXDelta="-100%" />
<alpha
android:duration="500"
android:fromAlpha="1.0"
android:toAlpha="0.0" />
</set>
定义style:
<style name="popupAnimation" parent="android:Animation">
<item name="android:windowEnterAnimation">@anim/in</item>
<item name="android:windowExitAnimation">@anim/out</item>
</style>
通过setAnimationStyle方法设置popupAnimation实现动画效果。
调用方式:通过showAtLocation设置弹出菜单弹出的位置,实现setOnItemClickListener监听点击选项回调事件。