1. 程式人生 > >自定義PopupWindow彈出框(帶有動畫)和呼叫相簿相機佈局

自定義PopupWindow彈出框(帶有動畫)和呼叫相簿相機佈局

使用PopupWindow來實現彈出框,並且帶有動畫效果



效果一:(第二張圖)首先自定義PopupWindow

public class LostPopupWindow extends PopupWindow {
    public Lost lost;
    public void onLost(Lost lost){
        this.lost = lost;
    }
    private View conentView;

    public View getConentView() {
        return conentView;
    }

    public LostPopupWindow(final Activity context) {
        LayoutInflater inflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        conentView = inflater.inflate(R.layout.lost_pop_menu, null);
        int h = context.getWindowManager().getDefaultDisplay().getHeight();
        int w = context.getWindowManager().getDefaultDisplay().getWidth();
        // 設定SelectPicPopupWindow的View
        this.setContentView(conentView);
        // 設定SelectPicPopupWindow彈出窗體的寬
        this.setWidth(w / 2 + 50);
        // 設定SelectPicPopupWindow彈出窗體的高
        this.setHeight(LayoutParams.WRAP_CONTENT);
        // 設定SelectPicPopupWindow彈出窗體可點選
        this.setFocusable(true);
        this.setOutsideTouchable(true);
        // 重新整理狀態
        this.update();
        // 例項化一個ColorDrawable顏色為半透明
        ColorDrawable dw = new ColorDrawable(0000000000);
        // 點back鍵和其他地方使其消失,設定了這個才能觸發OnDismisslistener ,設定其他控制元件變化等操作
        this.setBackgroundDrawable(dw);
        // mPopupWindow.setAnimationStyle(android.R.style.Animation_Dialog);
        // 設定SelectPicPopupWindow彈出窗體動畫效果
        this.setAnimationStyle(R.style.AnimationPreview);
        LinearLayout send = (LinearLayout) conentView
                .findViewById(R.id.send);
        LinearLayout mySend = (LinearLayout) conentView
                .findViewById(R.id.my_send);
        LinearLayout all = (LinearLayout) conentView.findViewById(R.id.all);
        send.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View arg0) {
                LostPopupWindow.this.dismiss();
                lost.onLost(2);
            }
        });

        mySend.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                LostPopupWindow.this.dismiss();
                lost.onLost(1);
            }
        });

        all.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                LostPopupWindow.this.dismiss();
                lost.onLost(0);
            }
        });
    }

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

}
R.layout.lost_pop_menu檔案

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="200dp"
    android:layout_height="wrap_content"
    android:layout_alignParentRight="true"
    android:background="@drawable/black_menu_pop_bg"
    android:orientation="vertical"
    android:paddingLeft="@dimen/activity_horizontal_margin">

    <LinearLayout
        android:id="@+id/send"
        android:layout_width="match_parent"
        android:layout_height="40dp"
        android:gravity="center_vertical"
        android:orientation="horizontal"
        android:scaleType="fitXY">

        <ImageView
            android:id="@+id/img5"
            android:layout_width="20dp"
            android:layout_height="20dp"
            android:src="@drawable/icon_lost_add" />

        <TextView
            android:id="@+id/item_content"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="10dp"
            android:text="釋出資訊"
            android:textColor="#e5e5e6"
            android:textSize="18sp" />
    </LinearLayout>

    <View
        android:layout_width="match_parent"
        android:layout_height="1px"
        android:background="#616467" />

    <LinearLayout
        android:id="@+id/my_send"
        android:layout_width="match_parent"
        android:layout_height="40dp"
        android:gravity="center_vertical"
        android:orientation="horizontal">

        <ImageView
            android:id="@+id/img6"
            android:layout_width="20dp"
            android:layout_height="20dp"
            android:scaleType="fitXY"
            android:src="@drawable/icon_lost_my" />

        <TextView
            android:id="@+id/item_content1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="10dp"
            android:text="我釋出的資訊"
            android:textColor="#e5e5e6"
            android:textSize="18sp" />
    </LinearLayout>
    <View
        android:layout_width="match_parent"
        android:layout_height="1px"
        android:background="#616467" />

    <LinearLayout
        android:id="@+id/all"
        android:layout_width="match_parent"
        android:layout_height="40dp"
        android:gravity="center_vertical"
        android:orientation="horizontal">

        <ImageView
            android:id="@+id/img7"
            android:layout_width="20dp"
            android:layout_height="20dp"
            android:scaleType="fitXY"
            android:src="@drawable/icon_all" />

        <TextView
            android:id="@+id/item_content2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="10dp"
            android:text="全部資訊"
            android:textColor="#e5e5e6"
            android:textSize="18sp" />
    </LinearLayout>
</LinearLayout>

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



@anim/fade_in

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


@anim/fade_out

<!-- 左上角縮小 -->
<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" />
呼叫
LostPopupWindow popWindow = new LostPopupWindow(ZiXunDetailActivity.this);
                ((ImageView)(popWindow.getConentView().findViewById(R.id.img5))).setImageResource(R.drawable.ckplico);
                ((ImageView)(popWindow.getConentView().findViewById(R.id.img6))).setImageResource(R.drawable.fbplico);
                ((ImageView)(popWindow.getConentView().findViewById(R.id.img7))).setImageResource(R.drawable.zfplico);
                ((TextView)(popWindow.getConentView().findViewById(R.id.item_content))).setText("檢視評論");
                ((TextView)(popWindow.getConentView().findViewById(R.id.item_content1))).setText("發表評論");
                ((TextView)(popWindow.getConentView().findViewById(R.id.item_content2))).setText("轉發文章");
                popWindow.showPopupWindow(linMain);
                popWindow.onLost(new Lost() {
                    @Override
                    public void onLost(int index) {
                        switch (index){
                            case 0: //轉發文章
                                break;
                            case 1:      //發表評論
                                lineFooter.setVisibility(View.VISIBLE);
                                break;
                            case 2://檢視評論
                                Bundle bundle=new Bundle();
                                bundle.putString("id",mID);
                                startActivity(PingLunActivity.class, "熱門評論", bundle);
                                break;
                        }
                    }
                });
效果二:(第一張圖)

1.工具類

import android.app.Activity;
import android.content.Context;
import android.graphics.drawable.ColorDrawable;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnTouchListener;
import android.view.ViewGroup.LayoutParams;
import android.widget.Button;
import android.widget.PopupWindow;

import com.example.lgy.myviewpagerapplication.R;

public class SelectPicPopupWindow extends PopupWindow {


    private Button btn_take_photo, btn_pick_photo, btn_cancel;
    private View mMenuView;

    public SelectPicPopupWindow(Activity context,OnClickListener itemsOnClick) {
        super(context);
        LayoutInflater inflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        mMenuView = inflater.inflate(R.layout.alert_dialog, null);
        btn_take_photo = (Button) mMenuView.findViewById(R.id.btn_take_photo);
        btn_pick_photo = (Button) mMenuView.findViewById(R.id.btn_pick_photo);
        btn_cancel = (Button) mMenuView.findViewById(R.id.btn_cancel);
        //取消按鈕
        btn_cancel.setOnClickListener(new OnClickListener() {

            public void onClick(View v) {
                //銷燬彈出框
                dismiss();
            }
        });
        //設定按鈕監聽
        btn_pick_photo.setOnClickListener(itemsOnClick);
        btn_take_photo.setOnClickListener(itemsOnClick);
        //設定SelectPicPopupWindow的View
        this.setContentView(mMenuView);
        //設定SelectPicPopupWindow彈出窗體的寬
        this.setWidth(LayoutParams.FILL_PARENT);
        //設定SelectPicPopupWindow彈出窗體的高
        this.setHeight(LayoutParams.WRAP_CONTENT);
        //設定SelectPicPopupWindow彈出窗體可點選
        this.setFocusable(true);
        //設定SelectPicPopupWindow彈出窗體動畫效果
        this.setAnimationStyle(R.style.AnimationPreview);
        //例項化一個ColorDrawable顏色為半透明
        ColorDrawable dw = new ColorDrawable(0xb0000000);
        //設定SelectPicPopupWindow彈出窗體的背景
        this.setBackgroundDrawable(dw);
        //mMenuView新增OnTouchListener監聽判斷獲取觸屏位置如果在選擇框外面則銷燬彈出框
        mMenuView.setOnTouchListener(new OnTouchListener() {

            public boolean onTouch(View v, MotionEvent event) {

                int height = mMenuView.findViewById(R.id.pop_layout).getTop();
                int y=(int) event.getY();
                if(event.getAction()==MotionEvent.ACTION_UP){
                    if(y<height){
                        dismiss();
                    }
                }
                return true;
            }
        });

    }

}

2.佈局,動畫就用上面的
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:gravity="center_horizontal"
    android:orientation="vertical"
    >

    <LinearLayout
        android:id="@+id/pop_layout"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:gravity="center_horizontal"
        android:orientation="vertical"
        android:layout_alignParentBottom="true"
        android:background="@drawable/bg_home_search"
        >


        <Button
            android:id="@+id/btn_take_photo"
            android:layout_marginLeft="20dip"
            android:layout_marginRight="20dip"
            android:layout_marginTop="20dip"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:text="拍照"
            android:background="@drawable/bg_home_search"
            android:textStyle="bold"
            />

        <Button
            android:id="@+id/btn_pick_photo"
            android:layout_marginLeft="20dip"
            android:layout_marginRight="20dip"
            android:layout_marginTop="5dip"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:text="從相簿選擇"
            android:background="@drawable/bg_home_search"
            android:textStyle="bold"
            />

        <Button
            android:id="@+id/btn_cancel"
            android:layout_marginLeft="20dip"
            android:layout_marginRight="20dip"
            android:layout_marginTop="15dip"
            android:layout_marginBottom="15dip"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:text="取消"
            android:background="@drawable/bg_home_search"
            android:textStyle="bold"

            />
    </LinearLayout>
</RelativeLayout>

3.按鈕背景
<?xml version="1.0" encoding="utf-8"?>
<!--<shape xmlns:android="http://schemas.android.com/apk/res/android"-->
    <!--android:shape="rectangle">-->
    <!--<corners android:radius="5dp"/>-->
    <!--<solid-->
        <!--android:color="@color/ball_blue"/>-->

<!--</shape>-->
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">

    <stroke
        android:width="1dp"
        android:color="#C2C0C0" />
    <solid android:color="#FFFFFF" />
    <padding
        android:bottom="5dp"
        android:left="5dp"
        android:right="5dp"
        android:top="5dp" />
    <corners android:radius="5dp" />
</shape>

4.主函式程式碼
import android.app.Activity;  
import android.os.Bundle;  
import android.view.Gravity;  
import android.view.View;  
import android.view.View.OnClickListener;  
import android.widget.TextView;  
  
public class MainActivity extends Activity {  
  
    //自定義的彈出框類  
    SelectPicPopupWindow menuWindow;  
      
    @Override  
    public void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.activity_main);  
        TextView tv = (TextView) this.findViewById(R.id.text);  
        //把文字控制元件新增監聽,點選彈出自定義視窗  
        tv.setOnClickListener(new OnClickListener() {             
            public void onClick(View v) {  
                //例項化SelectPicPopupWindow  
                menuWindow = new SelectPicPopupWindow(MainActivity.this, itemsOnClick);  
                //顯示視窗  
                menuWindow.showAtLocation(MainActivity.this.findViewById(R.id.main), Gravity.BOTTOM|Gravity.CENTER_HORIZONTAL, 0, 0); //設定layout在PopupWindow中顯示的位置  
            }  
        });  
    }  
      
    //為彈出視窗實現監聽類  
    private OnClickListener  itemsOnClick = new OnClickListener(){  
  
        public void onClick(View v) {  
            menuWindow.dismiss();  
            switch (v.getId()) {  
            case R.id.btn_take_photo:  
                break;  
            case R.id.btn_pick_photo:                 
                break;  
            default:  
                break;  
            }  
              
                  
        }  
          
    };  
      
}