PopWindow可以在指定的任一位置显示,而且灵活,由于项目需要,草草学习了一下就开始做了,下面看我实现的效果:
这是xml实现的效果图:
所用到的素材:左边的图片,带三角形的.9图(可以自己拉也可以在网上找)
下面看实现的代码(只是贴出重要的代码,也可以直接拷贝到你的项目中去,理清逻辑就好了)
Popwindow的布局(popupwindow_add.xml):
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:background="@color/transparent">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="7dp"
android:background="@drawable/popwindow_bg"
android:orientation="vertical">
<LinearLayout
android:id="@+id/re_addfriends"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="14dp"
android:layout_marginRight="18dp"
android:layout_marginTop="15dp"
android:background="@color/white"
android:orientation="horizontal">
<ImageView
android:layout_width="25dp"
android:layout_height="25dp"
android:src="@drawable/addfriend" />
<TextView
android:id="@+id/id_add_friend"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginLeft="10dp"
android:textSize="16sp"
android:text="添加好友" />
</LinearLayout>
<LinearLayout
android:id="@+id/re_addgroup"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="14dp"
android:layout_marginRight="18dp"
android:layout_marginTop="15dp"
android:background="@color/white"
android:orientation="horizontal">
<ImageView
android:layout_width="25dp"
android:layout_height="25dp"
android:src="@drawable/addgroup" />
<TextView
android:id="@+id/id_add_group"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:textSize="16sp"
android:layout_marginLeft="10dp"
android:text="创建群组" />
</LinearLayout>
<LinearLayout
android:id="@+id/re_addDiscussion"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="14dp"
android:layout_marginRight="18dp"
android:layout_marginTop="15dp"
android:background="@color/white"
android:orientation="horizontal">
<ImageView
android:layout_width="25dp"
android:layout_height="25dp"
android:src="@drawable/adddiscussion" />
<TextView
android:id="@+id/id_add_discussion"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="16sp"
android:layout_gravity="center"
android:layout_marginLeft="10dp"
android:text="创建讨论组" />
</LinearLayout>
<TextView
android:layout_width="wrap_content"
android:layout_height="15dp" />
</LinearLayout>
</LinearLayout>
实现一个窗体动画效果,需要自定义:
<style name="AnimationPreview">
<item name="android:windowEnterAnimation">@anim/fade_in</item>
<item name="android:windowExitAnimation">@anim/fade_out</item>
</style>
在anim文件夹下自定义以下两个动画效果:
face_in.xml:
<?xml version="1.0" encoding="utf-8"?>
<alpha xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/accelerate_interpolator"
android:fromAlpha="0.0" android:toAlpha="1.0"
android:duration="150" />
face_out.xml:
<?xml version="1.0" encoding="utf-8"?>
<alpha xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/accelerate_interpolator"
android:fromAlpha="1.0" android:toAlpha="0.0"
android:duration="150" />
准备工作已经完成,接下来开始自定义一个PopupWindow:
public class MyPopWindow extends PopupWindow implements View.OnClickListener{
private LinearLayout re_addfriends;
private LinearLayout re_addgroup;
private LinearLayout re_addDiscussion;
public MyPopWindow(Activity context){
LayoutInflater inflater= (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View content=inflater.inflate(R.layout.popupwindow_add,null);
initview(content);
this.setContentView(content);
this.setWidth(LinearLayout.LayoutParams.WRAP_CONTENT);
this.setHeight(LinearLayout.LayoutParams.WRAP_CONTENT);
this.setFocusable(true);
this.setOutsideTouchable(true);
this.update();//刷新状态
ColorDrawable dw=new ColorDrawable(0000000000);//半透明
this.setBackgroundDrawable(dw);// 点back键和其他地方使其消失,设置了这个才能触发OnDismisslistener ,设置其他控件变化等操作
this.setAnimationStyle(R.style.AnimationPreview); // 设置SelectPicPopupWindow弹出窗体动画效果
re_addfriends.setOnClickListener(this);
re_addgroup.setOnClickListener(this);
re_addDiscussion.setOnClickListener(this);
}
private void initview(View v) {
re_addfriends= (LinearLayout) v.findViewById(R.id.re_addfriends);
re_addgroup= (LinearLayout) v.findViewById(R.id.re_addgroup);
re_addDiscussion= (LinearLayout) v.findViewById(R.id.re_addDiscussion);
}
@Override
public void onClick(View view) {
switch (view.getId()){
case R.id.re_addfriends:
Toast.makeText(getContentView().getContext(),"添加好友",Toast.LENGTH_SHORT).show();
MyPopWindow.this.dismiss();
break;
case R.id.re_addgroup:
Toast.makeText(getContentView().getContext(),"创建群组",Toast.LENGTH_SHORT).show();
MyPopWindow.this.dismiss();
break;
case R.id.re_addDiscussion:
Toast.makeText(getContentView().getContext(),"创建讨论组",Toast.LENGTH_SHORT).show();
MyPopWindow.this.dismiss();
break;
}
}
//显示popupWindow
public void showPopupWindow(View v){
if(!this.isShowing()){
this.showAsDropDown(v,0,0);
}else{
this.dismiss();
}
}
}
最后需要在你要显示的地方调用这个类,将view传入即可。例如:我需要点击一个imageview后弹出PopupWindow.
那么先实例化后调用showPopupWindow(imageview)即可。
代码:
imageview.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
MyPopWindow myPopWindow=new MyPopWindow(getActivity());
myPopWindow.showPopupWindow(imageview);
}
});