Android实现第一次进入App时的引导学习界面

来源:互联网 发布:wkwebview js交互回调 编辑:程序博客网 时间:2024/04/27 00:29

转载请标明出处:http://blog.csdn.net/xx326664162/article/details/51013176 文章出自:薛瑄的博客

你也可以查看我的其他同类文章,也会让你有一定的收货!

因为我们所熟知的Android平台是一个又一个的Activity组成的,每一个Activity有一个或者多个View构成。所以说,当我们想显示一个界面的时候,我们首先想到的是建立一个Activity,然后所有的操作在Activity里面实现,或者是一个Dialog或者Toast。这种方式固然简单,但是在有些情况下,我们要求的只是简单的显示,用Activity显然是多余,这个时候,我们如何处理呢?

原来,整个Android的窗口机制是基于一个叫做 WindowManager,这个接口可以添加view到屏幕,也可以从屏幕删除view。

其实我们的Activity或者Diolog底层的实现也是通过WindowManager,这个 WindowManager是全局的,在整个系统是唯一的。它是显示View的最底层了。

效果图:

点击屏幕任何一个位置,引导界面消失

这里写图片描述

源码分析

  • 两个类:GuideUtil,ScreenUtils
  • 两个动画文件:fade_in.xml ,fade_out.xml
  • 一个在主activity:MainActivity

先看看MainActivity 中如何使用这两个类,再深入其中看看这两个类怎么工作

1、MainActivity

public class MainActivity extends Activity {    private GuideUtil guideUtil = null;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        /**获取引导界面工具类的实例**/        guideUtil = GuideUtil.getInstance();        /**显示引导界面,程序一启动就会显示引导界面**/        guideUtil.initGuide(this, R.drawable.add_guide);        findViewById(R.id.button1).setOnClickListener(new OnClickListener() {            @Override            public void onClick(View v) {                /**如果引导界面消失了,可点击这个按钮,显示引导界面**/                guideUtil.initGuide(MainActivity.this, R.drawable.add_guide);            }        });        findViewById(R.id.button2).setOnClickListener(new OnClickListener() {            @Override            public void onClick(View v) {                /**实际程序中,如果不是第一次,那不会显示引导界面。                在setFirst中设置false,模拟这个效果。                点击上面的按钮,不会再弹出引导界面**/                //是否是第一次进入app                guideUtil.setFirst(false);                guideUtil.initGuide(MainActivity.this, R.drawable.add_guide);            }        });    }}

2、GuideUtil

初始化引导图层,并设置一个事件。

/** * @类名:GuideUtil * @类描述:引导工具界面 * @修改人: * @修改时间: * @修改备注: * @版本: */public class GuideUtil {    private Context context;    private ImageView imgView;    private WindowManager windowManager;    private static GuideUtil instance = null;    /** 是否第一次进入该程序 **/    private boolean isFirst = true;    /**采用私有的方式,只保证这种通过单例来引用,同时保证这个对象不会存在多个**/    private GuideUtil() {    }    /**采用单例的设计模式,同时用了同步锁**/    public static GuideUtil getInstance() {        synchronized (GuideUtil.class) {            if (null == instance) {                instance = new GuideUtil();            }        }        return instance;    }    private Handler handler = new Handler(Looper.getMainLooper()) {        public void handleMessage(android.os.Message msg) {            switch (msg.what) {            case 1:                // 设置LayoutParams参数                final LayoutParams params = new WindowManager.LayoutParams();                // 设置显示的类型,TYPE_PHONE指的是来电话的时候会被覆盖,其他时候会在最前端,显示位置在stateBar下面,其他更多的值请查阅文档                params.type = WindowManager.LayoutParams.TYPE_PHONE;                // 设置显示格式                params.format = PixelFormat.RGBA_8888;                // 设置对齐方式                params.gravity = Gravity.LEFT | Gravity.TOP;                // 设置宽高                params.width = ScreenUtils.getScreenWidth(context);                params.height = ScreenUtils.getScreenHeight(context);                // 设置动画                params.windowAnimations = R.style.view_anim;                // 添加到当前的窗口上                windowManager.addView(imgView, params);                break;            }        };    };/**     * @方法说明:初始化     * @方法名称:initGuide     * @param context     * @param drawableRourcesId:引导图片的资源Id     * @返回值:void     */    public void initGuide(Activity context, int drawableRourcesId) {        /**如果不是第一次进入该界面**/        if (!isFirst) {            return;        }        this.context = context;        windowManager = context.getWindowManager();        /** 动态初始化图层**/        imgView = new ImageView(context);        imgView.setLayoutParams(new LayoutParams(                android.view.ViewGroup.LayoutParams.MATCH_PARENT,                android.view.ViewGroup.LayoutParams.MATCH_PARENT));        imgView.setScaleType(ScaleType.FIT_XY);        imgView.setImageResource(drawableRourcesId);        /**这里我特意用了一个handler延迟显示界面,主要是为了进入界面后,你能看到它淡入得动画效果,不然的话,引导界面就直接显示出来**/        handler.sendEmptyMessageDelayed(1, 1000);        imgView.setOnClickListener(new OnClickListener() {            @Override            public void onClick(View arg0) {                /** 点击图层之后,将图层移除**/                windowManager.removeView(imgView);            }        });    }    public boolean isFirst() {        return isFirst;    }/**     * @方法说明:设置是否第一次进入该程序     * @方法名称:setFirst     * @param isFirst     * @返回值:void     */    public void setFirst(boolean isFirst) {        this.isFirst = isFirst;    }}

3、ScreenUtils

这个类主要获取屏幕的宽度和高度

ScreenUtils类,在上面代码的44 和45 两个地方有用到

/** * @类名:ScreenUtils * @类描述:屏幕工具类 * @修改人: * @修改时间: * @修改备注: * @版本: */public class ScreenUtils {    /**     * @方法说明:获取DisplayMetrics对象     * @方法名称:getDisPlayMetrics     * @param context     * @return     * @返回值:DisplayMetrics     */    public static DisplayMetrics getDisPlayMetrics(Context context) {        DisplayMetrics metric = new DisplayMetrics();        if (null != context) {            ((Activity) context).getWindowManager().getDefaultDisplay()                    .getMetrics(metric);        }        return metric;    }    /**     * @方法说明:获取屏幕的宽度(像素)     * @方法名称:getScreenWidth     * @param context     * @return     * @返回值:int     */    public static int getScreenWidth(Context context) {        int width = getDisPlayMetrics(context).widthPixels;        return width;    }    /**     * @方法说明:获取屏幕的高(像素)     * @方法名称:getScreenHeight     * @param context     * @return     * @返回值:int     */    public static int getScreenHeight(Context context) {        int height = getDisPlayMetrics(context).heightPixels;        return height;    }    /**     * @方法说明:屏幕密度(0.75 / 1.0 / 1.5)     * @方法名称:getDensity     * @param context     * @return     * @返回 float     */    public static float getDensity(Context context) {        float density = getDisPlayMetrics(context).density;        return density;    }    /**     * @方法说明:屏幕密度DPI(120 / 160 / 240)     * @方法名称:getDensityDpi     * @param context     * @return     * @返回 int     */    public static int getDensityDpi(Context context) {        int densityDpi = getDisPlayMetrics(context).densityDpi;        return densityDpi;    }}

4、两个动画文件

fade_in.xml

<?xml version="1.0" encoding="utf-8"?><alpha xmlns:android="http://schemas.android.com/apk/res/android"    android:duration="2000"    android:fromAlpha="0.0"    android:toAlpha="1.0" />

fade_out.xml

<?xml version="1.0" encoding="utf-8"?><alpha xmlns:android="http://schemas.android.com/apk/res/android"    android:duration="2000"    android:fromAlpha="1.0"    android:toAlpha="0.0" />

源码下载:

原作者想赚点资源分,提供了eclipse项目代码,如果手头分数还算宽裕,去原作者那里下载吧

如果没有分的并且不会转化为AS项目的,我提供了这个下载地址。

转载:http://blog.csdn.net/u011993368/article/details/43764737

1 0
原创粉丝点击