1. 程式人生 > >仿照微信自定義PopupWindow

仿照微信自定義PopupWindow

我又來了,今天給大家介紹下自定義的PopupWindow,剛開始學習android的時候我就知道微信使用的就是這個,但是剛開始的時候搞不清楚和Dialog的區別,所以今天想通過簡單的介紹,讓大家知道他們的區別,然後老規矩,奉獻上自己的程式碼。哈哈
**一.概述:**
Android的對話方塊有兩種:PopupWindow AlertDialog.他們的不同點在於AlertDialog的位置固定,而PopupWindow的位置可以隨意設定自己的位置。
是不是很簡單呢,哈哈,來吧,還是直接看程式碼吧;
眾所周知android提供給我們的控制元件是有限的,所以想要實現自己的控制元件,只能通過自定義,繼承PopupWindow。
先看佈局
popupwindow.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_margin="5dp"
    android:background="@drawable/title_tools_bg"
    android:gravity="center"
android:orientation="vertical">
<LinearLayout android:id="@+id/ll_edittext" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="10dp" android:layout_marginRight="10dp" android:gravity="center"
android:orientation="horizontal" android:padding="5dp">
<ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:scaleType="fitCenter" android:src="@drawable/copy_pressed" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="5dp" android:text="編輯文字" android:textColor="#fff" android:textSize="18sp" android:textStyle="bold" /> </LinearLayout> <View android:layout_width="wrap_content" android:layout_height="1dp" android:layout_marginLeft="5dp" android:layout_marginRight="5dp" android:background="#fff" /> <LinearLayout android:id="@+id/ll_share" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="10dp" android:layout_marginRight="10dp" android:gravity="center" android:orientation="horizontal" android:padding="5dp"> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:scaleType="fitCenter" android:src="@drawable/share" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="5dp" android:text="分享內容" android:textColor="#fff" android:textSize="18sp" android:textStyle="bold" /> </LinearLayout> <View android:layout_width="wrap_content" android:layout_height="1dp" android:layout_marginLeft="5dp" android:layout_marginRight="5dp" android:background="#fff" /> <LinearLayout android:id="@+id/ll_magic" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="10dp" android:layout_marginRight="10dp" android:gravity="center" android:orientation="horizontal" android:padding="5dp"> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:scaleType="fitCenter" android:src="@drawable/title_btn_function" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="5dp" android:text="魔法圖示" android:textColor="#fff" android:textSize="18sp" android:textStyle="bold" /> </LinearLayout> </LinearLayout>

MyPopupWindow類

package com.lv.activity;

import android.content.Context;
import android.graphics.drawable.ColorDrawable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.WindowManager;
import android.widget.LinearLayout;
import android.widget.PopupWindow;
import android.widget.Toast;

/**
 * Created by mac on 16/11/14.
 */

public class MyPopupWindow extends PopupWindow implements View.OnClickListener {


    private View view;
    private LinearLayout ll_magic, ll_share, ll_edittext;
    private Context context;

    public MyPopupWindow(Context context) {
        super(context);
        this.context = context;
        //載入佈局
        LayoutInflater inflater = (LayoutInflater)
                context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        view = inflater.inflate(R.layout.popuwindow, null);
        WindowManager wm = (WindowManager) context
                .getSystemService(Context.WINDOW_SERVICE);
        int height = wm.getDefaultDisplay().getHeight();
        int width = wm.getDefaultDisplay().getWidth();
        //把MyPopupWindow 新增到佈局中去
        this.setContentView(view);
        // 設定MyPopupWindow彈出窗體的寬
        this.setWidth(width / 2);
        // 設定MyPopupWindow彈出窗體的高度
        this.setHeight(WindowManager.LayoutParams.WRAP_CONTENT);
        // 設定MyPopupWindow彈出窗體可點選
        this.setFocusable(true);
        this.setOutsideTouchable(true);
        //重新整理狀態
        this.update();
        // 例項化一個ColorDrawable顏色為半透明
        ColorDrawable dw = new ColorDrawable(0000000000);
        // 點back鍵和其他地方使其消失,設定了這個才能觸發OnDismisslistener ,設定其他控制元件變化等操作
        this.setBackgroundDrawable(dw);
        // 設定SelectPicPopupWindow彈出窗體動畫效果
        this.setAnimationStyle(R.style.AnimationPreview);//在stytle中配置下
        //初始化控制元件
        ll_edittext = (LinearLayout) view.findViewById(R.id.ll_edittext);
        ll_share = (LinearLayout) view.findViewById(R.id.ll_share);
        ll_magic = (LinearLayout) view.findViewById(R.id.ll_magic);
        //設定點選事件
        ll_edittext.setOnClickListener(this);
        ll_share.setOnClickListener(this);
        ll_magic.setOnClickListener(this);


    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.ll_edittext:
                Toast.makeText(context, "編輯文字", Toast.LENGTH_SHORT).show();
                break;
            case R.id.ll_share:
                Toast.makeText(context, "分享文字", Toast.LENGTH_SHORT).show();
                break;
            case R.id.ll_magic:
                Toast.makeText(context, "魔法圖示", Toast.LENGTH_SHORT).show();
                break;
        }
        MyPopupWindow.this.dismiss();
    }

    /**
     * 顯示popupWindow
     *
     * @param parent
     */
    public void showPopupWindow(View parent) {
        if (!this.isShowing()) {
            // 以下拉方式顯示popupwindow
            this.showAsDropDown(parent, parent.getLayoutParams().width / 2, 18);
        } else {
            this.dismiss();
        }
    }
}

這些都清楚後了,下面就是簡單的呼叫了,很簡單
PopupwindowActivity類

public class PopuwindowActivity extends Activity {
    private Button mBtn;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_popuwindow);
        mBtn = (Button) findViewById(R.id.search_close_btn);
        mBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                MyPopupWindow popupWindow = new MyPopupWindow(PopuwindowActivity.this);
                popupWindow.showPopupWindow(mBtn);
            }
        });
    }

}

這裡面為了不讓我們的程式看起來單調,所以加入了切換的動畫。程式碼也粘貼出來吧。
R.style.AnimationPreview
自定義style

  <style name="AnimationPreview">
        <item name="android:windowEnterAnimation">@anim/fade_in</item>
        <item name="android:windowExitAnimation">@anim/fade_out</item>
    </style>

fade_in.xml和fade_out.xml 點選和消失的動畫

<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" />

<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" />

大家看下吧,很簡單,程式碼只不過是輔助大家學習的,真正想要學習的話,大家還得通過自己不斷的努力。自定義的路還是漫長的,以後會奉獻出更多的自定義控制元件和講解,不明白的地方歡迎留言交流。