上一篇文章介绍了通过Dialog的方式来处理蒙层详情,但是使用的时候还是有局限性,由于dialog是要依附于某个具体的Activity才能弹出显示的,当依附的Activity finish后Dialog也会跟着消失,对于一些特定的需求当依附的Activity消失后仍需要显示蒙层,只有用户点击了蒙层才能消失就不能使用Dialog这种方式了.
解决这个问题,我这里想到的是通过Activity来处理,将Activity设置为全屏的透明效果,再修改其打开和关闭的动画为淡入淡出即可.
下面直接贴代码,布局文件还是一个ImageView
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<ImageView
android:id="@+id/iv_img"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:src="@drawable/ic_add_wish_suc"/>
</android.support.constraint.ConstraintLayout>
GuideActivity
package blog.youkuaiyun.com.mchenys;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.ImageView;
import blog.youkuaiyun.com.mchenys.R;
/**
* 透明的Activity,用于展示蒙层弹窗新手指引
* Created by mChenys on 2018/10/31.
*/
public class GuideActivity extends AppCompatActivity implements View.OnClickListener {
private ImageView mGuideView;
private int[] imageIds;//多张引导图数组
private int currPosition;//当前显示第几个引导图
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//去掉标题
//requestWindowFeature(Window.FEATURE_NO_TITLE);
Window window = getWindow();
//全屏无状态栏
// window.setFlags(WindowManager.LayoutParams. FLAG_FULLSCREEN , WindowManager.LayoutParams. FLAG_FULLSCREEN);
//全屏 但是有状态栏
WindowManager.LayoutParams attrs = window.getAttributes();
attrs.flags &= ~WindowManager.LayoutParams.FLAG_FULLSCREEN;
window.setAttributes(attrs);
setContentView(R.layout.activity_guide);
this.imageIds = getIntent().getIntArrayExtra("ids");
mGuideView = findViewById(R.id.iv_img);
mGuideView.setImageResource(imageIds[0]);//默认显示第一张蒙层
mGuideView.setOnClickListener(this);
}
/**
* 显示蒙层
* @param activity
* @param imageIds 接收一个图片数组,支持多张蒙层依次显示
*/
public static void show(Activity activity, int[] imageIds) {
Intent intent = new Intent(activity, GuideActivity.class);
intent.putExtra("ids", imageIds);
activity.startActivity(intent);
//设置activity打开关闭的动画
activity.overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out);
}
@Override
public void onClick(View v) {
if (++currPosition < imageIds.length) {
//点击切换显示下一个引导图
mGuideView.setImageResource(imageIds[currPosition]);
} else {
//没有下一张时隐藏activity
finish();
overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out);
}
}
}
设置GuideActivity的Style样式
<style name="translucent" parent="Theme.AppCompat.Light.NoActionBar">
<item name="android:windowBackground">@color/full_transparent</item>
<item name="android:windowIsTranslucent">true</item>
<item name="android:windowNoTitle">true</item>
<item name="android:windowContentOverlay">@null</item>
</style>
最后在清单文件中给GuideActivity设置主题样式
<activity android:name=".GuideActivity"
android:theme="@style/translucent"/>
Ok,使用方式仍然还是一行代码搞定
GuideActivity.show(mContext,new int[]{R.drawable.ic_guide_01, R.drawable.ic_guide_02});