1. 程式人生 > >通過透明Activity來展示新手指引蒙層

通過透明Activity來展示新手指引蒙層

上一篇文章介紹了通過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.csdn.net.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.csdn.net.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});