基本用法
使用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佈局的文件就沒有貼上了,很簡單的!!!
最後,請大神勿噴,這是本人第一次寫博客,謝謝支持!!!!!!!!