PopupWindow封装(下)

PopupWindow封装(下)

1.1 前言

弹出PopupWindow同时使背景变暗这个功能怎么实现?本篇文章就简单谈谈怎么实现这个功能。

最终效果图:
这里写图片描述

1.2 弹出PopupWindow 同时背景变暗

我们知道,一个Activity包含了一个Window对象,Activity是不直接显示View的,View 被绑定到Window上来得以呈现,也就是说View必须是依附Window而存在的,同样PopupWindow也是如此。因此要控制整个屏幕的背景的变暗和变亮,我们只需要控制当前Activity的window的亮度,通过alpha属性的值来控制就行了。

我们先来写个例子测试一下:通过一个seekBar来控制alpha值来改变屏幕的亮度。

1.2.3 xml 文件如下:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    >

   <android.support.v7.widget.AppCompatSeekBar
       android:id="@+id/seek_bar"
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
     android:layout_centerInParent="true"
       android:layout_marginLeft="10dp"
       android:layout_marginRight="10dp"
       android:layout_marginBottom="20dp"
       />
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="改变当前window亮度:"
        android:textColor="@android:color/darker_gray"
        android:textSize="16sp"
        android:layout_above="@+id/seek_bar"
        android:layout_marginBottom="10dp"
        android:layout_marginLeft="10dp"
        />
</RelativeLayout>

1.2.4 代码如下:

mAppCompatSeekBar = (AppCompatSeekBar) findViewById(R.id.seek_bar);
mAppCompatSeekBar.setMax(100);
mAppCompatSeekBar.setProgress(100);
mAppCompatSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
    @Override
    public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
       float alpha = seekBar.getProgress() * 1.0f / 100 ;
        if(alpha < 0.2){
            alpha = 0.2f;
        }
       Window mWindow = getWindow();
        WindowManager.LayoutParams params = mWindow.getAttributes();
        params.alpha = alpha;
        mWindow.setAttributes(params);
    }

    @Override
    public void onStartTrackingTouch(SeekBar seekBar) {

    }

    @Override
    public void onStopTrackingTouch(SeekBar seekBar) {

    }
});

效果如下:
这里写图片描述
看到没?随着拖动seekBar,屏幕的亮度就跟着改变了,这不就是我们想要的效果嘛。

PopupWindow 弹出和消失时改变当前window的alpha 来控制屏幕亮度。

有了上面的测试,我们就可以让PopupWindow弹出时,同时屏幕变暗了。在build()方法中添加如下代码:

// 获取当前Activity的window
Activity activity = (Activity) mContentView.getContext();
if(activity!=null && mIsBackgroundDark){
    //如果设置的值在0 - 1的范围内,则用设置的值,否则用默认值
    final  float alpha = (mBackgroundDrakValue > 0 && mBackgroundDrakValue < 1) ? mBackgroundDrakValue : DEFAULT_ALPHA;
    mWindow = activity.getWindow();
    WindowManager.LayoutParams params = mWindow.getAttributes();
    params.alpha = alpha;
    mWindow.setAttributes(params);
}

加了上面的代码,在弹出PopupWindow的时候,屏幕就会变暗了,但是你会发现一个问题,PopupWindow消失之后,屏幕仍然是暗的,这当然不是我们想要的,因此在PopupWindow消失的时候,需要改回原来的值。重写onDismiss方法,添加如下代码:

//如果设置了背景变暗,那么在dissmiss的时候需要还原
if(mWindow!=null){
    WindowManager.LayoutParams params = mWindow.getAttributes();
    params.alpha = 1.0f;
    mWindow.setAttributes(params);
}

现在,这个功能就完成了。看一下效果图:
这里写图片描述

1.3 CustomPopWindow 使用背景变暗配置

上面讲了背景变暗的思路和方法,那么我们看一下CustomPopWindow 怎么使用这个功能,非常简单,添加了2个配置方法:

enableBackgroundDark(boolean isDark):是否开启背景变暗,使用默认亮度值,也可以使用setBgDarkAlpha改变亮度值。
setBgDarkAlpha(float darkValue):改变背景亮度值。

示例代码如下:

//创建并显示popWindow
mCustomPopWindow= new CustomPopWindow.PopupWindowBuilder(this)
          .setView(contentView)
          .enableBackgroundDark(true) //弹出popWindow时,背景是否变暗
          .setBgDarkAlpha(0.7f) // 控制亮度
          .create()
          .showAsDropDown(mButton5,0,20);

1.4 添加PopupWindow显示和消失动画

有时候,我们可能需要在PopupWindow 显示和消失的时候添加上一些动画,Popwindow是可以自己添加显示和消失的动画的,通过setAnimationStyle方法设置,显示动画和消失动画分别由android:windowEnterAnimation和android:windowExitAnimation2个属性控制。

如下步骤:
(1) 在res/anim 下添加两个动画文件
popwindow_anim_in:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
   <alpha android:fromAlpha="0"
          android:toAlpha="1.0"
          android:duration="100"
       />
    <scale android:fromXScale="0"
           android:toXScale="1.0"
           android:fromYScale="0"
           android:toYScale="1.0"
           android:duration="100"
        />
</set>

popwindow_anim_out:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
   <alpha android:fromAlpha="1.0"
          android:toAlpha="0.0"
          android:duration="100"
       />
    <scale android:fromXScale="1.0"
           android:toXScale="0"
           android:fromYScale="1.0"
           android:toYScale="0"
           android:duration="100"
        />
</set>

(2) 在styles.xml 中添加一个style

<style name="CustomPopWindowStyle">
    <item name="android:windowEnterAnimation">@anim/popwindow_anim_in</item>
    <item name="android:windowExitAnimation">@anim/popwindow_anim_out</item>
</style>

(3) 通过setAnimationStyle 应用动画

CustomPopWindow popWindow = new CustomPopWindow.PopupWindowBuilder(this)
    .setView(R.layout.pop_layout1)
    .setFocusable(true)
    .setOutsideTouchable(true)
    .setAnimationStyle(R.style.CustomPopWindowStyle) // 添加自定义显示和消失动画
    .create()
    .showAsDropDown(mButton1,0,10);

通过上面就可以给PopupoWindow的显示和消失添加动画,除此之外,在API 21 以上,Google 给PopupWindow 添加了2个新方法用来添加显示和消失时的过渡动画,setEnterTransition和setExitTransition,有兴趣的可以去研究一下。

点击查看源码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值