开源库 AppIntro

本贴最后更新于 2738 天前,其中的信息可能已经事过境迁

分享歌曲

github:[https://github.com/apl-devs/AppIntro](https://github.com/apl-devs/AppIntro) 官方介绍 > AppIntro is an Android Library that helps you make a cool intro for your app, like the ones in Google apps.

使用方法
1.添加到 build.gradle
{% codeblock %}
repositories {
mavenCentral()
}

dependencies {
compile 'com.github.paolorotolo:appintro:4.1.0'
}
{% endcodeblock %}
2.添加一个继承自 AppIntro 或者 AppIntro2 的 Activity
{% codeblock lang:Java %}
public class IntroActivity extends AppIntro {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

    // Note here that we DO NOT use setContentView();

    // Add your slide fragments here.
    // AppIntro will automatically generate the dots indicator and buttons.
    //两种方式添加引导也,一个自定义的fragment,二是通过AppIntroFragment来自动图片标题的引导页
    addSlide(firstFragment);
    addSlide(secondFragment);
    addSlide(thirdFragment);
    addSlide(fourthFragment);

    // Instead of fragments, you can also use our default slide
    // Just set a title, description, background and image. AppIntro will do the rest.
    addSlide(AppIntroFragment.newInstance(title, description, image, backgroundColor));

    // OPTIONAL METHODS
    // Override bar/separator color.
    //颜色选择
    setBarColor(Color.parseColor("#3F51B5"));
    setSeparatorColor(Color.parseColor("#2196F3"));

    // Hide Skip/Done button.
    //跳过按钮
    showSkipButton(false);
    setProgressButtonEnabled(false);

    // Turn vibration on and set intensity.
    // NOTE: you will probably need to ask VIBRATE permission in Manifest.
    //震动设置
    setVibrate(true);
    setVibrateIntensity(30);
}
//事件
@Override
public void onSkipPressed(Fragment currentFragment) {
    super.onSkipPressed(currentFragment);
    // Do something when users tap on Skip button.
}

@Override
public void onDonePressed(Fragment currentFragment) {
    super.onDonePressed(currentFragment);
    // Do something when users tap on Done button.
}

@Override
public void onSlideChanged(@Nullable Fragment oldFragment, @Nullable Fragment newFragment) {
    super.onSlideChanged(oldFragment, newFragment);
    // Do something when the slide changes.
}

}
{% endcodeblock %}
几大重点

  • 继承自 AppIntro 的 Activity 不需要 setContentView();(这坑我采了)
  • 通过 addSlide()来一个个添加引导页
  • 可自重写跳过、完成、滑动事件
  • 使用布局来直接添加引导页使用 AppIntro2

3.在 Manifest 中定义 Activity(如果是自己新建的是 class 而不是 Activity)
{% codeblock %}

{% endcodeblock %}
动画效果
{% codeblock lang:Java %}
setFadeAnimation()
setZoomAnimation()
setFlowAnimation()
setSlideOverAnimation()
setDepthAnimation()
{% endcodeblock %}

实践

定义 MaterialGuideActivity 继承 AppIntro2,实现图片引导页,添加动画,重写完成和跳过事件来记录是否为第一次引导。

{% codeblock lang:Java %}
//省略 package 和 import
public class MaterialGuideActivity extends AppIntro2 {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

// AppIntro do not need setContentView
// setContentView(R.layout.material_guide1);
addSlide(IntroSlideUtil.newInstance(R.drawable.guide1));
addSlide(IntroSlideUtil.newInstance(R.drawable.guide2));
addSlide(IntroSlideUtil.newInstance(R.drawable.guide3));
addSlide(IntroSlideUtil.newInstance(R.drawable.guide4));
showSkipButton(true);
setVibrate(true);
setVibrateIntensity(30);
// setFadeAnimation();
// setFlowAnimation();
// setZoomAnimation();
setDepthAnimation();

}

//记录是否已经看过引导页
@Override
public void onSkipPressed(Fragment currentFragment) {
startActivity(new Intent(MaterialGuideActivity.this, MainActivity.class));
SharePrefereceTool.setPrefBoolean(MaterialGuideActivity.this, "guide_showed", true);
finish();
}

@Override
public void onDonePressed(Fragment currentFragment) {
    startActivity(new Intent(MaterialGuideActivity.this, MainActivity.class));
    SharePrefereceTool.setPrefBoolean(MaterialGuideActivity.this, "guide_showed", true);
    finish();
}

}

{% endcodeblock %}
IntroSlideUtil.java
{% codeblock lang:Java %}
//省略 package 和 import
/*
*AppIntro 中布局使用 fragment,

  • 如果是图片直接返回全屏图片

  • 如果是布局则 inflate 返回
    */
    public class IntroSlideUtil extends Fragment {

    private static final String IMAGE_RES_ID = "imageResId";
    private int imageId;
    private static final String LAYOUT_RES_ID = "layoutResId";
    private int layoutId;
    private static final String FLAG_LAYOUT = "flag";
    private boolean flag = false;

    public static IntroSlideUtil newInstance(int imageResId) {
    IntroSlideUtil sample = new IntroSlideUtil();

     Bundle args = new Bundle();
     args.putInt(IMAGE_RES_ID, imageResId);
     sample.setArguments(args);
     return sample;
    

    }
    public static IntroSlideUtil newInstance(int layoutResId, boolean isLayout) {
    IntroSlideUtil sample = new IntroSlideUtil();
    Bundle args = new Bundle();
    args.putInt(LAYOUT_RES_ID, layoutResId);
    args.putBoolean(FLAG_LAYOUT, isLayout);
    sample.setArguments(args);
    return sample;
    }

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if (getArguments() != null && getArguments().containsKey(IMAGE_RES_ID)) {
    imageId = getArguments().getInt(IMAGE_RES_ID);
    } else if (getArguments() != null && getArguments().containsKey(LAYOUT_RES_ID)) {
    layoutId = getArguments().getInt(LAYOUT_RES_ID);
    flag = getArguments().getBoolean(FLAG_LAYOUT);
    }
    }

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container,
    @Nullable Bundle savedInstanceState) {
    if (flag) {
    return inflater.inflate(layoutId, container, false);
    } else {
    ImageView imageView = new ImageView(getContext());
    Glide.with(getContext()).load(imageId).into(imageView);
    imageView.setScaleType(ImageView.ScaleType.FIT_XY);
    Log.e("tag", getContext().toString());
    imageView.setLayoutParams(new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
    ViewGroup.LayoutParams.MATCH_PARENT));
    return imageView;
    }
    }
    }
    {% endcodeblock %}
    效果图
    {% asset_img screenshot1.png screenshot1 %}{% asset_img screenshot2.png screenshot2 %}

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • AngularJS

    AngularJS 诞生于 2009 年,由 Misko Hevery 等人创建,后为 Google 所收购。是一款优秀的前端 JS 框架,已经被用于 Google 的多款产品当中。AngularJS 有着诸多特性,最为核心的是:MVC、模块化、自动化双向数据绑定、语义化标签、依赖注入等。2.0 版本后已经改名为 Angular。

    12 引用 • 50 回帖 • 489 关注
  • VirtualBox

    VirtualBox 是一款开源虚拟机软件,最早由德国 Innotek 公司开发,由 Sun Microsystems 公司出品的软件,使用 Qt 编写,在 Sun 被 Oracle 收购后正式更名成 Oracle VM VirtualBox。

    10 引用 • 2 回帖 • 14 关注
  • 友情链接

    确认过眼神后的灵魂连接,站在链在!

    24 引用 • 373 回帖 • 2 关注
  • 持续集成

    持续集成(Continuous Integration)是一种软件开发实践,即团队开发成员经常集成他们的工作,通过每个成员每天至少集成一次,也就意味着每天可能会发生多次集成。每次集成都通过自动化的构建(包括编译,发布,自动化测试)来验证,从而尽早地发现集成错误。

    15 引用 • 7 回帖
  • 小说

    小说是以刻画人物形象为中心,通过完整的故事情节和环境描写来反映社会生活的文学体裁。

    30 引用 • 108 回帖
  • Maven

    Maven 是基于项目对象模型(POM)、通过一小段描述信息来管理项目的构建、报告和文档的软件项目管理工具。

    186 引用 • 318 回帖 • 259 关注
  • BAE

    百度应用引擎(Baidu App Engine)提供了 PHP、Java、Python 的执行环境,以及云存储、消息服务、云数据库等全面的云服务。它可以让开发者实现自动地部署和管理应用,并且提供动态扩容和负载均衡的运行环境,让开发者不用考虑高成本的运维工作,只需专注于业务逻辑,大大降低了开发者学习和迁移的成本。

    19 引用 • 75 回帖 • 656 关注
  • Jenkins

    Jenkins 是一套开源的持续集成工具。它提供了非常丰富的插件,让构建、部署、自动化集成项目变得简单易用。

    54 引用 • 37 回帖 • 2 关注
  • 强迫症

    强迫症(OCD)属于焦虑障碍的一种类型,是一组以强迫思维和强迫行为为主要临床表现的神经精神疾病,其特点为有意识的强迫和反强迫并存,一些毫无意义、甚至违背自己意愿的想法或冲动反反复复侵入患者的日常生活。

    15 引用 • 161 回帖 • 1 关注
  • OneDrive
    2 引用 • 1 关注
  • Excel
    31 引用 • 28 回帖
  • webpack

    webpack 是一个用于前端开发的模块加载器和打包工具,它能把各种资源,例如 JS、CSS(less/sass)、图片等都作为模块来使用和处理。

    41 引用 • 130 回帖 • 253 关注
  • 996
    13 引用 • 200 回帖 • 10 关注
  • Notion

    Notion - The all-in-one workspace for your notes, tasks, wikis, and databases.

    10 引用 • 76 回帖 • 2 关注
  • 程序员

    程序员是从事程序开发、程序维护的专业人员。

    581 引用 • 3535 回帖
  • Swagger

    Swagger 是一款非常流行的 API 开发工具,它遵循 OpenAPI Specification(这是一种通用的、和编程语言无关的 API 描述规范)。Swagger 贯穿整个 API 生命周期,如 API 的设计、编写文档、测试和部署。

    26 引用 • 35 回帖 • 3 关注
  • Office

    Office 现已更名为 Microsoft 365. Microsoft 365 将高级 Office 应用(如 Word、Excel 和 PowerPoint)与 1 TB 的 OneDrive 云存储空间、高级安全性等结合在一起,可帮助你在任何设备上完成操作。

    5 引用 • 34 回帖
  • Node.js

    Node.js 是一个基于 Chrome JavaScript 运行时建立的平台, 用于方便地搭建响应速度快、易于扩展的网络应用。Node.js 使用事件驱动, 非阻塞 I/O 模型而得以轻量和高效。

    139 引用 • 269 回帖
  • Scala

    Scala 是一门多范式的编程语言,集成面向对象编程和函数式编程的各种特性。

    13 引用 • 11 回帖 • 154 关注
  • TextBundle

    TextBundle 文件格式旨在应用程序之间交换 Markdown 或 Fountain 之类的纯文本文件时,提供更无缝的用户体验。

    1 引用 • 2 回帖 • 71 关注
  • Telegram

    Telegram 是一个非盈利性、基于云端的即时消息服务。它提供了支持各大操作系统平台的开源的客户端,也提供了很多强大的 APIs 给开发者创建自己的客户端和机器人。

    5 引用 • 35 回帖 • 1 关注
  • JetBrains

    JetBrains 是一家捷克的软件开发公司,该公司位于捷克的布拉格,并在俄国的圣彼得堡及美国麻州波士顿都设有办公室,该公司最为人所熟知的产品是 Java 编程语言开发撰写时所用的集成开发环境:IntelliJ IDEA

    18 引用 • 54 回帖 • 3 关注
  • Webswing

    Webswing 是一个能将任何 Swing 应用通过纯 HTML5 运行在浏览器中的 Web 服务器,详细介绍请看 将 Java Swing 应用变成 Web 应用

    1 引用 • 15 回帖 • 635 关注
  • 服务器

    服务器,也称伺服器,是提供计算服务的设备。由于服务器需要响应服务请求,并进行处理,因此一般来说服务器应具备承担服务并且保障服务的能力。

    125 引用 • 585 回帖
  • 安全

    安全永远都不是一个小问题。

    204 引用 • 816 回帖
  • Electron

    Electron 基于 Chromium 和 Node.js,让你可以使用 HTML、CSS 和 JavaScript 构建应用。它是一个由 GitHub 及众多贡献者组成的活跃社区共同维护的开源项目,兼容 Mac、Windows 和 Linux,它构建的应用可在这三个操作系统上面运行。

    15 引用 • 136 回帖 • 3 关注
  • C

    C 语言是一门通用计算机编程语言,应用广泛。C 语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。

    85 引用 • 165 回帖 • 5 关注