开源库 AppIntro

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

分享歌曲

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 %}

相关帖子

欢迎来到这里!

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

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

推荐标签 标签

  • ReactiveX

    ReactiveX 是一个专注于异步编程与控制可观察数据(或者事件)流的 API。它组合了观察者模式,迭代器模式和函数式编程的优秀思想。

    1 引用 • 2 回帖 • 153 关注
  • WiFiDog

    WiFiDog 是一套开源的无线热点认证管理工具,主要功能包括:位置相关的内容递送;用户认证和授权;集中式网络监控。

    1 引用 • 7 回帖 • 585 关注
  • GitHub

    GitHub 于 2008 年上线,目前,除了 Git 代码仓库托管及基本的 Web 管理界面以外,还提供了订阅、讨论组、文本渲染、在线文件编辑器、协作图谱(报表)、代码片段分享(Gist)等功能。正因为这些功能所提供的便利,又经过长期的积累,GitHub 的用户活跃度很高,在开源世界里享有深远的声望,并形成了社交化编程文化(Social Coding)。

    209 引用 • 2031 回帖
  • V2Ray
    1 引用 • 15 回帖
  • JSON

    JSON (JavaScript Object Notation)是一种轻量级的数据交换格式。易于人类阅读和编写。同时也易于机器解析和生成。

    52 引用 • 190 回帖
  • SOHO

    为成为自由职业者在家办公而努力吧!

    7 引用 • 55 回帖 • 18 关注
  • Log4j

    Log4j 是 Apache 开源的一款使用广泛的 Java 日志组件。

    20 引用 • 18 回帖 • 30 关注
  • Vue.js

    Vue.js(读音 /vju ː/,类似于 view)是一个构建数据驱动的 Web 界面库。Vue.js 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件。

    264 引用 • 665 回帖
  • RYMCU

    RYMCU 致力于打造一个即严谨又活泼、专业又不失有趣,为数百万人服务的开源嵌入式知识学习交流平台。

    4 引用 • 6 回帖 • 52 关注
  • CongSec

    本标签主要用于分享网络空间安全专业的学习笔记

    1 引用 • 1 回帖 • 10 关注
  • HTML

    HTML5 是 HTML 下一个的主要修订版本,现在仍处于发展阶段。广义论及 HTML5 时,实际指的是包括 HTML、CSS 和 JavaScript 在内的一套技术组合。

    107 引用 • 295 回帖 • 2 关注
  • jsoup

    jsoup 是一款 Java 的 HTML 解析器,可直接解析某个 URL 地址、HTML 文本内容。它提供了一套非常省力的 API,可通过 DOM,CSS 以及类似于 jQuery 的操作方法来取出和操作数据。

    6 引用 • 1 回帖 • 482 关注
  • 人工智能

    人工智能(Artificial Intelligence)是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门技术科学。

    132 引用 • 188 回帖
  • Unity

    Unity 是由 Unity Technologies 开发的一个让开发者可以轻松创建诸如 2D、3D 多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。

    25 引用 • 7 回帖 • 186 关注
  • 安全

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

    199 引用 • 816 回帖
  • 程序员

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

    565 引用 • 3532 回帖
  • Postman

    Postman 是一款简单好用的 HTTP API 调试工具。

    4 引用 • 3 回帖 • 2 关注
  • PHP

    PHP(Hypertext Preprocessor)是一种开源脚本语言。语法吸收了 C 语言、 Java 和 Perl 的特点,主要适用于 Web 开发领域,据说是世界上最好的编程语言。

    179 引用 • 407 回帖 • 489 关注
  • Tomcat

    Tomcat 最早是由 Sun Microsystems 开发的一个 Servlet 容器,在 1999 年被捐献给 ASF(Apache Software Foundation),隶属于 Jakarta 项目,现在已经独立为一个顶级项目。Tomcat 主要实现了 JavaEE 中的 Servlet、JSP 规范,同时也提供 HTTP 服务,是市场上非常流行的 Java Web 容器。

    162 引用 • 529 回帖 • 4 关注
  • 微服务

    微服务架构是一种架构模式,它提倡将单一应用划分成一组小的服务。服务之间互相协调,互相配合,为用户提供最终价值。每个服务运行在独立的进程中。服务于服务之间才用轻量级的通信机制互相沟通。每个服务都围绕着具体业务构建,能够被独立的部署。

    96 引用 • 155 回帖
  • frp

    frp 是一个可用于内网穿透的高性能的反向代理应用,支持 TCP、UDP、 HTTP 和 HTTPS 协议。

    20 引用 • 7 回帖 • 2 关注
  • Telegram

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

    5 引用 • 35 回帖
  • 架构

    我们平时所说的“架构”主要是指软件架构,这是有关软件整体结构与组件的抽象描述,用于指导软件系统各个方面的设计。另外还有“业务架构”、“网络架构”、“硬件架构”等细分领域。

    142 引用 • 442 回帖
  • Typecho

    Typecho 是一款博客程序,它在 GPLv2 许可证下发行,基于 PHP 构建,可以运行在各种平台上,支持多种数据库(MySQL、PostgreSQL、SQLite)。

    12 引用 • 65 回帖 • 453 关注
  • 创造

    你创造的作品可能会帮助到很多人,如果是开源项目的话就更赞了!

    176 引用 • 995 回帖 • 1 关注
  • golang

    Go 语言是 Google 推出的一种全新的编程语言,可以在不损失应用程序性能的情况下降低代码的复杂性。谷歌首席软件工程师罗布派克(Rob Pike)说:我们之所以开发 Go,是因为过去 10 多年间软件开发的难度令人沮丧。Go 是谷歌 2009 发布的第二款编程语言。

    497 引用 • 1387 回帖 • 294 关注
  • 星云链

    星云链是一个开源公链,业内简单的将其称为区块链上的谷歌。其实它不仅仅是区块链搜索引擎,一个公链的所有功能,它基本都有,比如你可以用它来开发部署你的去中心化的 APP,你可以在上面编写智能合约,发送交易等等。3 分钟快速接入星云链 (NAS) 测试网

    3 引用 • 16 回帖 • 2 关注