PopupWindow 自定義,簡單實用

基本用法

使用PopupWindow很簡單,可以總結爲三個步驟:

  1. 創建PopupWindow對象實例;

  2. 設置背景、註冊事件監聽器和添加動畫;

  3. 顯示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佈局的文件就沒有貼上了,很簡單的!!!
最後,請大神勿噴,這是本人第一次寫博客,謝謝支持!!!!!!!!
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章