你的位置:首页 > 操作系统

[操作系统]自定义PopupWindow


 

 一、布局

 

<??><LinearLayout ="http://schemas.android.com/apk/res/android"  android:layout_width="match_parent"  android:layout_height="wrap_content"  android:orientation="vertical"  android:background="#ffffff"  android:padding="20dp" >  <TextView    android:layout_width="match_parent"    android:layout_height="wrap_content"    android:clickable="true"    android:gravity="center"    android:textColor="@android:color/holo_orange_dark"    android:text="确定" />  <TextView    android:layout_marginTop="20dp"    android:layout_width="match_parent"    android:layout_height="wrap_content"    android:layout_marginBottom="10dp"    android:clickable="true"    android:gravity="center"    android:text="取消" /></LinearLayout>

二、自定义MypopupWindow继承PopupWindow

public class MyPopupWindow extends PopupWindow {

 

 

三、重写构造方法与动画样式

在styles.

<style name="MyPopupWindow">    <item name="android:windowEnterAnimation">@anim/pop_in</item>    <item name="android:windowExitAnimation">@anim/pop_out</item>  </style>

 

pop_in
<??><set ="http://schemas.android.com/apk/res/android">  <!-- 平移  <translate     android:duration="5000"     android:fromXDelta="100%"     android:toXDelta="0"/>     -->  <scale    android:fromXScale="0"    android:fromYScale="0"    android:pivotX="50%"    android:pivotY="50%"    android:toXScale="0.8"    android:toYScale="0.5"    android:duration="200"/>  <!--fromXScalefromYScale起始时X,Y座标,pivotXpivotY动画起始位置,相对于屏幕的百分比,两个都为50%表示动画从屏幕中间开始toXScaletoYScale动画最终缩放的倍数, 1.0为正常大小,大于1.0放大duration动画持续时间 -->  <!--透明度-->  <alpha    android:duration="200"    android:fromAlpha="0.0"    android:toAlpha="1.0"/></set>

pop_out
<??><set ="http://schemas.android.com/apk/res/android">  <!-- <translate    android:duration="5000"    android:fromXDelta="0"    android:toXDelta="100%"/>-->  <scale    android:fromXScale="0.8"    android:fromYScale="0.5"    android:pivotX="50%"    android:pivotY="50%"    android:toXScale="0"    android:toYScale="0"    android:duration="200"/>  <alpha    android:duration="200"    android:fromAlpha="1.0"    android:toAlpha="0.0"/></set>

 

四、重写构造方法并设置点击外部可以消失监听

 super(context);    this.mContext=context;    //打气筒    mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);    //打气    mContentView = mInflater.inflate(R.layout.layout_dialog,null);    //设置View    setContentView(mContentView);    //设置宽与高    setWidth(WindowManager.LayoutParams.MATCH_PARENT);    setHeight(WindowManager.LayoutParams.WRAP_CONTENT);    /**     * 设置进出动画     */    setAnimationStyle(R.style.MyPopupWindow);    /**     * 设置背景只有设置了这个才可以点击外边和BACK消失     */    setBackgroundDrawable(new ColorDrawable());    /**     * 设置可以获取集点     */    setFocusable(true);    /**     * 设置点击外边可以消失     */    setOutsideTouchable(true);    /**     *设置可以触摸     */    setTouchable(true);    /**     * 设置点击外部可以消失     */    setTouchInterceptor(new View.OnTouchListener() {      @Override      public boolean onTouch(View v, MotionEvent event) {        /**         * 判断是不是点击了外部         */        if(event.getAction()==MotionEvent.ACTION_OUTSIDE){          return true;        }        //不是点击外部        return false;      }    });    

 

五、显示及设置窗口变暗与变亮

public void displayDialog(View view){    MyPopupWindow myPopupWindow = new MyPopupWindow(this);    myPopupWindow.showAsDropDown(mBtnDispaly,0,0);    lightOff();    /**     * 消失时屏幕变亮     */    myPopupWindow.setOnDismissListener(new PopupWindow.OnDismissListener() {      @Override      public void onDismiss() {        WindowManager.LayoutParams layoutParams = getWindow().getAttributes();        layoutParams.alpha=1.0f;        getWindow().setAttributes(layoutParams);      }    });  }  /**   * 显示时屏幕变暗   */  private void lightOff() {    WindowManager.LayoutParams layoutParams = getWindow().getAttributes();    layoutParams.alpha=0.3f;    getWindow().setAttributes(layoutParams);  }

六、完整

package liu.basedemo.view;import android.content.Context;import android.graphics.drawable.ColorDrawable;import android.view.LayoutInflater;import android.view.MotionEvent;import android.view.View;import android.view.WindowManager;import android.widget.PopupWindow;import liu.basedemo.R;/** * 学习PopupWindow * Created by 刘楠 on 2016/8/1 0001.17:42 */public class MyPopupWindow extends PopupWindow {  Context mContext;  private LayoutInflater mInflater;  private View mContentView;  public MyPopupWindow(Context context) {    super(context);    this.mContext=context;    //打气筒    mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);    //打气    mContentView = mInflater.inflate(R.layout.layout_dialog,null);    //设置View    setContentView(mContentView);    //设置宽与高    setWidth(WindowManager.LayoutParams.MATCH_PARENT);    setHeight(WindowManager.LayoutParams.WRAP_CONTENT);    /**     * 设置进出动画     */    setAnimationStyle(R.style.MyPopupWindow);    /**     * 设置背景只有设置了这个才可以点击外边和BACK消失     */    setBackgroundDrawable(new ColorDrawable());    /**     * 设置可以获取集点     */    setFocusable(true);    /**     * 设置点击外边可以消失     */    setOutsideTouchable(true);    /**     *设置可以触摸     */    setTouchable(true);    /**     * 设置点击外部可以消失     */    setTouchInterceptor(new View.OnTouchListener() {      @Override      public boolean onTouch(View v, MotionEvent event) {        /**         * 判断是不是点击了外部         */        if(event.getAction()==MotionEvent.ACTION_OUTSIDE){          return true;        }        //不是点击外部        return false;      }    });    /**     * 初始化View与监听器     */    initView();    initListener();  }  private void initView() {  }  private void initListener() {  }}