关闭

Android 功能引导

标签: Android UI
290人阅读 评论(0) 收藏 举报
分类:

项目做完了,做了第一次启动,滑动的引导页了。

  然后需求又要改成流行的图层图片引导了。如图:

   大家一定也经常见吧,实现当然很简单了。FrameLayout上加一个图层就完了呗。让它点击后消失。

 嗯,可是那么多界面,难道所有界面布局都要改吗?改成根元素上再套一层FrameLayout?

   这里看过我 DecorView浅析 的童鞋,一定很来感觉。setContentView载入的布局的父元素不就是FrameLayout吗?

那么我们直接往它上面加引导图层不就可以了吗? Very good!

方法:

1.

   只需要解决怎么找到那个Framelayout,我这里想到的办法是给每个xml布局的根元素设置一个id,通过findViewById找到咋们通过setContentView设置上布局,

再通过View的view.getParent();得到它的父元素。它的父元素不就是咋们的要的FrameLayout吗?

然后创建一个ImageView设置上引导图片加到FrameLayout就可以了。

  由于有很多Activity,咋们当然要将这公共的事放在你们所有Activity的父类那里。我这里是BasicActivity。在onStart中调用了添加引导图片的方法。

2.

  由于引导过的界面就没必要再次引导了。所以得保存记录。这里采用偏好设置保存,如果该Activity被引导过了,就将它的类全名保存下。

由于偏好设置只能保存键值(key-value)对,所以保存多个类名,我采用|a|b|c这种形式保存为value。


代码:

main.xml中的根元素上添加了id

复制代码
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:id="@id/my_content_view"
    >
<TextView  
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="@string/hello"
    />
<Button
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:id="@+id/btn"
    android:text="open sub"
    />
</LinearLayout>
复制代码

id定义在res/values下的 ids.xml中

<?xml version="1.0" encoding="utf-8"?>
<resources>
<item type="id" name="my_content_view"></item>
</resources>

BasicActivity代码:

复制代码
package com.my.decorview.test;
import android.app.Activity;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewParent;
import android.widget.FrameLayout;
import android.widget.ImageView;

/**
 * @author 曙光城邦
 * http://www.cnblogs.com/beenupper/
 *
 */
public class BasicActivity extends Activity {
    private int guideResourceId=0;//引导页图片资源id
    @Override
    protected void onStart() {
        super.onStart();
        addGuideImage();//添加引导页
    }

    /**
     * 添加引导图片
     */
    public void addGuideImage() {
        View view = getWindow().getDecorView().findViewById(R.id.my_content_view);//查找通过setContentView上的根布局
        if(view==null)return;
        if(MyPreferences.activityIsGuided(this, this.getClass().getName())){
            //引导过了
            return;
        }
        ViewParent viewParent = view.getParent();
        if(viewParent instanceof FrameLayout){
            final FrameLayout frameLayout = (FrameLayout)viewParent;
            if(guideResourceId!=0){//设置了引导图片
                final ImageView guideImage = new ImageView(this);
                FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.FILL_PARENT);
                guideImage.setLayoutParams(params);
          guideImage.setScaleType(ScaleType.FIT_XY);
                guideImage.setImageResource(guideResourceId);
                guideImage.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        frameLayout.removeView(guideImage);
                        MyPreferences.setIsGuided(getApplicationContext(), BasicActivity.this.getClass().getName());//设为已引导
                    }
                });
                frameLayout.addView(guideImage);//添加引导图片
                
            }
        }
    }
    
    /**子类在onCreate中调用,设置引导图片的资源id
     *并在布局xml的根元素上设置android:id="@id/my_content_view"
     * @param resId
     */
    protected void setGuideResId(int resId){
        this.guideResourceId=resId;
    }
}
复制代码

 

偏好设置代码:

复制代码
package com.my.decorview.test;

import android.content.Context;

/**
 * @author 曙光城邦
 * http://www.cnblogs.com/beenupper/
 *
 */
public class MyPreferences {
    //偏好文件名
    public static final String SHAREDPREFERENCES_NAME = "my_pref";
    //引导界面KEY
    private static final String KEY_GUIDE_ACTIVITY = "guide_activity";
    
    /**
     * 判断activity是否引导过
     * 
     * @param context
     * @return  是否已经引导过 true引导过了 false未引导
     */
    public static boolean activityIsGuided(Context context,String className){
        if(context==null || className==null||"".equalsIgnoreCase(className))return false;
        String[] classNames = context.getSharedPreferences(SHAREDPREFERENCES_NAME, Context.MODE_WORLD_READABLE)
                 .getString(KEY_GUIDE_ACTIVITY, "").split("\\|");//取得所有类名 如 com.my.MainActivity
         for (String string : classNames) {
            if(className.equalsIgnoreCase(string)){
                return true;
            }
        }
          return false;
    }
    
    /**设置该activity被引导过了。 将类名已  |a|b|c这种形式保存为value,因为偏好中只能保存键值对
     * @param context
     * @param className
     */
    public static void setIsGuided(Context context,String className){
        if(context==null || className==null||"".equalsIgnoreCase(className))return;
        String classNames = context.getSharedPreferences(SHAREDPREFERENCES_NAME, Context.MODE_WORLD_READABLE)
                 .getString(KEY_GUIDE_ACTIVITY, "");
        StringBuilder sb = new StringBuilder(classNames).append("|").append(className);//添加值
        context.getSharedPreferences(SHAREDPREFERENCES_NAME, Context.MODE_WORLD_READABLE)//保存修改后的值
        .edit()
        .putString(KEY_GUIDE_ACTIVITY, sb.toString())
        .commit();
    }
}
复制代码

 

MainActivity中添加引导页

复制代码
package com.my.decorview.test;


import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class MainActivity extends BasicActivity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        Button btn = (Button)findViewById(R.id.btn);
        btn.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View v) {
                startActivity(new Intent(MainActivity.this, SubActivity.class));
            }
            
        });
        
        
        
        setGuideResId(R.drawable.yindao01);//添加引导页
    }
}
复制代码

 

 

OK大功告成。只需要做两件事

1. 在BasicActivity的子类中的onCreate中调用 setGuideResId(int resId),设置引导图片资源id

2. 布局xml的根元素上添加Android:id="@id/my_content_view" 


转自:http://blog.csdn.net/goodding/article/details/8562985

Android学习交流群:523487222

(如果您觉得有用,欢迎加入,一起学习进步)
点击链接加入群【Android学习群】



1
0
查看评论

Android 操作引导功能

在我们开发一个新的应用程序或者对一个应用程序进行迭代改动较大时,大多数APP都会在用户第一次使用这些新功能的时候,通过一定的方法来告诉、指导用户发现、使用这些新的功能,而这个方法就是操作引导。通常情况下,我们见到的APP中出现的操作引导大概分为2种,一种就是在第一次打开应用的时候首先进入的不是首页,...
  • ITRenj
  • ITRenj
  • 2016-12-26 22:32
  • 2241

android实现App新手引导功能

直接上图看效果: 好了,看到了效果图,简单讲一下。 可以实现activity,fragment上任何控件的引导功能,可以自己任意改变样式。 特别注意在fragment里的方法有点不一样,要注意下。 源码下载地址:  http://download.csdn.net/...
  • zzq272804553
  • zzq272804553
  • 2017-01-20 17:01
  • 1455

android(2) 功能引导界面实现

一.界面实现:      记录下引导界面的实现,总体来说实现不算困难,前提是要有个美工帮你做这些引导图片:
  • u010708662
  • u010708662
  • 2015-05-20 09:27
  • 1736

关于android新手引导的开源使用

做APP的时候难免用到新手引导的效果。 先放一张效果的图片吧。虽然丑了点,讲究实用吧。 本人在开发的时候,使用了github这位同学的开源代码,这里推荐一下开源的github的地址:点击打开链接 将github下载的导入自己的项目,然后gradle配置成功后,就...
  • qq_21139343
  • qq_21139343
  • 2017-01-18 14:57
  • 1195

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

转载:http://blog.csdn.net/u011993368/article/details/43764737因为我们所熟知的Android平台是一个又一个的Activity组成的,每一个Activity有一个或者多个View构成。所以说,当我们想显示一个界面的时候,我们首先想到的是建立一个...
  • xx326664162
  • xx326664162
  • 2016-03-30 12:00
  • 4517

android首次进入App新手引导

在android App开发的时候,往往在首次进入应用要给用户一个引导,今天我就来实现这个功能,算作是自己的一个笔记,以后忘记了可以翻来看看,下面我们就来实现它吧.public class LaunchActivity extends BaseActivity { private ViewPage...
  • u012528368
  • u012528368
  • 2016-09-21 14:42
  • 324

Android开发之高亮引导

看下图,今天的任务就是它了,app 的高亮引导的实现,找到几个github上面已经实现的库,下载下来源码对比分析实现原理,整理自己的知识体系。下面是其中一个的效果图(我用DialogFragment实现了引导但是并没有做高亮实现,补充说明一点:该篇博客最好配合源码对比查看,不然感觉有那么点抽象,不知...
  • AnalyzeSystem
  • AnalyzeSystem
  • 2016-06-01 15:49
  • 3124

注册引导页面

今天在github看到一个不错的效果github地址https://github.com/anton46/Android-StepsView关键点: 如何使用 简单了解源码,看能否进行修改. 使用很简单引入项目 compile 'com.anton46:stepsview:0.0.2...
  • u014733374
  • u014733374
  • 2015-08-11 10:25
  • 800

android 第一次进入的引导界面实现方法

最近在写一个基础框架,介绍一下最简单的实现引导界面的功能,引导界面包括三个部分,一个Viewpager,一个个圆点指示器,一个Button,用来进入主界面,也可以不需要按钮,到最后一样再向右划动一下在进入。在写引导界面的时候我们还需要先在启动界面添加一个判断方法,判断是否是第一次进入软件,这个可以用...
  • lansus
  • lansus
  • 2015-10-14 10:47
  • 525

新手引导蒙层

关于这个,gitgub上有一篇还是不错的,传送门:https://github.com/binIoter/GuideView,感兴趣的小伙伴可以去看一下。 使用的话先倒库,这里就不多说了,会报错,修改了一下库的build.gradule就OK了~~下面看代码:MainActivitypackage...
  • AndroidStudioo
  • AndroidStudioo
  • 2016-09-14 15:58
  • 2525
    个人资料
    • 访问:173916次
    • 积分:2767
    • 等级:
    • 排名:第15362名
    • 原创:64篇
    • 转载:192篇
    • 译文:0篇
    • 评论:32条