基本用法
使用PopupWindow很简单,可以总结为三个步骤:
-
创建PopupWindow对象实例;
-
设置背景、注册事件监听器和添加动画;
-
显示PopupWindow。
-
记录一下自定义popupwindow使用步骤及方法:
1.自定义
public class CustomPopupWindow extends PopupWindow implements View.OnClickListener { private View mPopView; TextView showCall; RelativeLayout popup_secure_telephone, popup_ordinary_call; Button popup_cancel; public CustomPopupWindow(Context context) { super(context); init(context); setPopupWindow(); popup_secure_telephone.setOnClickListener(this); popup_ordinary_call.setOnClickListener(this); popup_cancel.setOnClickListener(this); } private void init(Context context) { LayoutInflater inflater = LayoutInflater.from(context); mPopView = inflater.inflate(R.layout.popup_window_detail, null); popup_cancel = (Button) mPopView.findViewById(R.id.popup_cancel); popup_secure_telephone = (RelativeLayout) mPopView.findViewById(R.id.popup_secure_telephone); popup_ordinary_call = (RelativeLayout) mPopView.findViewById(R.id.popup_ordinary_call); showCall = (TextView) mPopView.findViewById(R.id.popup_top_call); } /** * 设置窗口的相关属性 */ @SuppressLint("InlinedApi") private void setPopupWindow() { this.setContentView(mPopView);// 设置View showCall.setText(name); this.setWidth(ViewGroup.LayoutParams.MATCH_PARENT);// 设置弹出窗口的宽 this.setHeight(ViewGroup.LayoutParams.WRAP_CONTENT);// 设置弹出窗口的高 this.setFocusable(true);// 设置弹出窗口可 this.setAnimationStyle(R.style.DetailAnimation);// 设置动画 this.setBackgroundDrawable(new ColorDrawable(0x00000000));// 设置背景透明 this.setOutsideTouchable(true); this.setOnDismissListener(new OnDismissListener() { //退出popupwidon时显示父控件原来的颜色 @Override public void onDismiss() { WindowManager.LayoutParams lp = getWindow().getAttributes(); lp.alpha = 1.0f; getWindow().setAttributes(lp); } }); mPopView.setOnTouchListener(new View.OnTouchListener() {// 如果触摸位置在窗口外面则销毁 @Override public boolean onTouch(View v, MotionEvent event) { int height = mPopView.findViewById(R.id.id_pop_layout).getTop(); int y = (int) event.getY(); if (event.getAction() == MotionEvent.ACTION_UP) { if (y < height) { dismiss(); } } return true; } }); } @Override public void onClick(View v) { switch (v.getId()){ case R.id.popup_secure_telephone: break; case R.id.popup_ordinary_call: break; case R.id.popup_cancel: customPopupWindow.dismiss(); break; } } }
2.popup布局文件xml
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/id_pop_layout" android:layout_width="fill_parent" android:layout_height="wrap_content" android:gravity="center_horizontal" android:background="#ffffff"> <TextView android:id="@+id/popup_top_call" android:layout_width="match_parent" android:layout_height="40dp" android:text="呼叫" android:textColor="@color/colorPrimary" android:textSize="18sp" android:gravity="center_vertical" android:paddingLeft="20dp"/> <View android:id="@+id/dividing_Line_1" android:layout_width="match_parent" android:layout_height="0.2dp" android:background="@color/colorAccent" android:layout_below="@+id/popup_top_call" android:layout_marginLeft="20dp" android:layout_marginRight="20dp"/> <RelativeLayout android:id="@+id/popup_secure_telephone" android:layout_width="match_parent" android:layout_height="70dp" android:layout_below="@+id/dividing_Line_1" android:layout_marginRight="20dp"> <TextView android:layout_width="match_parent" android:layout_height="match_parent" android:text="安全电话" android:textColor="@color/colorPrimary" android:textSize="18sp" android:gravity="center_vertical" android:paddingLeft="20dp" /> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@mipmap/ic_launcher_round" android:layout_alignParentRight="true" android:layout_centerVertical="true" /> </RelativeLayout> <View android:id="@+id/dividing_Line_2" android:layout_width="match_parent" android:layout_height="0.2dp" android:background="@color/colorAccent" android:layout_below="@+id/popup_secure_telephone" android:layout_marginLeft="20dp" android:layout_marginRight="20dp"/> <RelativeLayout android:id="@+id/popup_ordinary_call" android:layout_width="match_parent" android:layout_height="70dp" android:layout_below="@+id/dividing_Line_2" android:layout_marginRight="20dp"> <TextView android:layout_width="match_parent" android:layout_height="match_parent" android:text="普通电话" android:textColor="@color/colorPrimary" android:textSize="18sp" android:gravity="center_vertical" android:paddingLeft="20dp" /> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@mipmap/ic_launcher_round" android:layout_alignParentRight="true" android:layout_centerVertical="true" /> </RelativeLayout> <View android:id="@+id/dividing_Line_3" android:layout_width="match_parent" android:layout_height="0.2dp" android:background="@color/colorAccent" android:layout_below="@+id/popup_ordinary_call" android:layout_marginLeft="20dp" android:layout_marginRight="20dp"/> <LinearLayout android:layout_width="match_parent" android:layout_height="70dp" android:orientation="vertical" android:layout_below="@+id/dividing_Line_3" android:gravity="center"> <Button android:id="@+id/popup_cancel" android:layout_width="match_parent" android:layout_height="60dp" android:layout_marginRight="20dp" android:layout_marginLeft="20dp" android:text="取消" android:textSize="16sp" android:textColor="@color/colorAccent" android:background="@drawable/login_btn_selector" /> </LinearLayout> </RelativeLayout>
3.样式
<style name="DetailAnimation"> <item name="android:windowEnterAnimation">@anim/in</item> <item name="android:windowExitAnimation">@anim/out</item> </style>
in.xml
<?xml version="1.0" encoding="utf-8"?> <!-- 对话框出来时的动画--> <scale xmlns:android="http://schemas.android.com/apk/res/android" android:interpolator="@android:anim/accelerate_decelerate_interpolator" android:fromXScale="0.001" android:toXScale="1.0" android:fromYScale="0.001" android:toYScale="1.0" android:pivotX="100%" android:pivotY="10%" android:duration="200" />
out.xml
<scale xmlns:android="http://schemas.android.com/apk/res/android" android:interpolator="@android:anim/accelerate_decelerate_interpolator" android:fromXScale="1.0" android:toXScale="0.001" android:fromYScale="1.0" android:toYScale="0.001" android:pivotX="100%" android:pivotY="10%" android:duration="200" />
当然,样式可以去设置,还有很多种,根据项目的需要再去配置吧
4.mainactivity中调用:
public class DetailActivity extends AppCompatActivity implements View.OnClickListener { @Bind(R.id.detail_image_call) ImageView detailCall; @Bind(R.id.detail_image_msg) ImageView detailMsg; CustomPopupWindow customPopupWindow; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_detail); ButterKnife.bind(this); customPopupWindow = new CustomPopupWindow(DetailActivity.this); setSupportActionBar(toolbar); getSupportActionBar().setDisplayHomeAsUpEnabled(true); initUi(); } public void initUi() { detailCall.setOnClickListener(this); detailMsg.setOnClickListener(this); } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: finish(); break; } return super.onOptionsItemSelected(item); } @Override public void onClick(View view) { Intent intent = null; switch (view.getId()){ case R.id.detail_image_call: //点击要弹出popupwindow时父控件显示为灰色 WindowManager.LayoutParams lp = getWindow().getAttributes(); lp.alpha = 0.3f; getWindow().setAttributes(lp); customPopupWindow.showAtLocation(DetailActivity.this.findViewById(R.id.detail_image_call), Gravity.BOTTOM|Gravity.CENTER_HORIZONTAL, 0, 0); break; case R.id.detail_image_msg: break; } }
好了,到这里基本都写完了,MainActivity布局的文件就没有贴上了,很简单的!!!
最后,请大神勿喷,这是本人第一次写博客,谢谢支持!!!!!!!!