整体思路:使用FrameLayout作为变暗区域的Root,并设置FrameLayout的foreground为黑色不透明的shape,之后就可以修改shape的透明度,让指定区域变暗。之后通过在子线程中添加延时,使屏幕变化缓慢执行,实现渐变效果。
本文结构
- 1.简单实现
- 2.在实现过程中添加延时效果,让其变暗有一个过程,再逐步恢复原样。
1.简单实现
1.1 新建dim.xml
先新建一个dim.xml文件(/drawable/dim.xml),里面放入要用的shape。
<?xml version="1.0" encoding="utf-8"?>
<shape
xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle" >
<solid android:color="#000000" />
</shape>
注意其中颜色为黑色(#000000),没有指定Alpha通道(透明度)的值。如果在这里指定了Alpha通道,如使用#ff000000,该Alpha通道的值(0xff)就会固定,无法再通过setAlpha()方法设置。
1.2 设置布局文件
将要变暗的区域放在FrameLayout中,并设置 FrameLayout 的 foreground 为上面定义的 dim.xml。
由于 dim.xml 是不透明的黑色,这里还设置了tools:foreground="",以免在Preview窗口一团黑。
<FrameLayout
android:id="@+id/fl_forDark"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:foreground="@drawable/dim"
tools:foreground=""
>
<android.support.v4.view.ViewPager
android:id="@+id/main_viewPager"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
</FrameLayout>
如果在设置tools:foreground=""时报错,检查一下有没有设置:
xmlns:tools="http://schemas.android.com/tools"
1.3 java代码部分
同样由于 dim.xml 是黑色的,在初始化时记得首先把它设置为透明:
mFrameLayout = (FrameLayout) findViewById(R.id.fl_forDark);
if (mFrameLayout.getForeground()!=null){
mFrameLayout.getForeground().setAlpha(0);
}
然后可以在点击事件中添加setAlpha()实现效果。
mFrameLayout.getForeground().setAlpha(127); //此句添加到第一个点击事件中,点击屏幕变暗
mFrameLayout.getForeground().setAlpha(0); //此句添加到第二个点击事件中,点击屏幕恢复
2.添加延时效果
通过实现上面的代码发现,屏幕变暗与恢复都是瞬间完成的,显得突兀,在实际开发过程中可能需要让其变化有一个过程。
2.1 新建一个Handle对象,在Hanlde调用改变透明度的方法
Handler mHandler = new Handler(){
@Override
public void handleMessage(Message msg) {
switch (msg.what){
case 1:
mFrameLayout.getForeground().setAlpha((int)msg.obj);
break;
}
}
};
2.2 在onClick()方法中修改,
先设置一个参数
private int alpha; //用于设定透明度的参数
将原来的两句删掉,
mFrameLayout.getForeground().setAlpha(127);
mFrameLayout.getForeground().setAlpha(0);
在用于变暗的onClick()中写入:
alpha = 0;
new Thread(new Runnable() {
@Override
public void run() {
while (alpha < 127) {
try {
Thread.sleep(4);
} catch (InterruptedException e) {
e.printStackTrace();
}
Message msg = mHandler.obtainMessage();
msg.what = 1;
alpha += 1; //每次加1,逐渐变暗
msg.obj = alpha;
mHandler.sendMessage(msg);
}
}
}).start();
在用于恢复的onClick()写入:
alpha = 127;
new Thread(new Runnable() {
@Override
public void run() {
while (alpha > 0) {
try {
Thread.sleep(4);
} catch (InterruptedException e) {
e.printStackTrace();
}
Message msg = mHandler.obtainMessage();
msg.what = 1;
alpha -= 1; //每次加1,逐渐变暗
msg.obj = alpha;
mHandler.sendMessage(msg);
}
}
}).start();
这样可以效果了。
网友评论