开源库 AppIntro

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

分享歌曲

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

相关帖子

欢迎来到这里!

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

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

推荐标签 标签

  • FlowUs

    FlowUs.息流 个人及团队的新一代生产力工具。

    让复杂的信息管理更轻松、自由、充满创意。

    1 引用 • 1 关注
  • jsDelivr

    jsDelivr 是一个开源的 CDN 服务,可为 npm 包、GitHub 仓库提供免费、快速并且可靠的全球 CDN 加速服务。

    5 引用 • 31 回帖 • 120 关注
  • Android

    Android 是一种以 Linux 为基础的开放源码操作系统,主要使用于便携设备。2005 年由 Google 收购注资,并拉拢多家制造商组成开放手机联盟开发改良,逐渐扩展到到平板电脑及其他领域上。

    337 引用 • 324 回帖 • 4 关注
  • Sphinx

    Sphinx 是一个基于 SQL 的全文检索引擎,可以结合 MySQL、PostgreSQL 做全文搜索,它可以提供比数据库本身更专业的搜索功能,使得应用程序更容易实现专业化的全文检索。

    1 引用 • 258 关注
  • Lute

    Lute 是一款结构化的 Markdown 引擎,支持 Go 和 JavaScript。

    29 引用 • 202 回帖 • 53 关注
  • V2Ray
    1 引用 • 15 回帖 • 4 关注
  • Vditor

    Vditor 是一款浏览器端的 Markdown 编辑器,支持所见即所得、即时渲染(类似 Typora)和分屏预览模式。它使用 TypeScript 实现,支持原生 JavaScript、Vue、React 和 Angular。

    386 引用 • 1892 回帖
  • 七牛云

    七牛云是国内领先的企业级公有云服务商,致力于打造以数据为核心的场景化 PaaS 服务。围绕富媒体场景,七牛先后推出了对象存储,融合 CDN 加速,数据通用处理,内容反垃圾服务,以及直播云服务等。

    30 引用 • 244 回帖 • 118 关注
  • HBase

    HBase 是一个分布式的、面向列的开源数据库,该技术来源于 Fay Chang 所撰写的 Google 论文 “Bigtable:一个结构化数据的分布式存储系统”。就像 Bigtable 利用了 Google 文件系统所提供的分布式数据存储一样,HBase 在 Hadoop 之上提供了类似于 Bigtable 的能力。

    17 引用 • 6 回帖 • 72 关注
  • Jenkins

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

    54 引用 • 37 回帖
  • 以太坊

    以太坊(Ethereum)并不是一个机构,而是一款能够在区块链上实现智能合约、开源的底层系统。以太坊是一个平台和一种编程语言 Solidity,使开发人员能够建立和发布下一代去中心化应用。 以太坊可以用来编程、分散、担保和交易任何事物:投票、域名、金融交易所、众筹、公司管理、合同和知识产权等等。

    34 引用 • 367 回帖
  • golang

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

    502 引用 • 1397 回帖 • 241 关注
  • 禅道

    禅道是一款国产的开源项目管理软件,她的核心管理思想基于敏捷方法 scrum,内置了产品管理和项目管理,同时又根据国内研发现状补充了测试管理、计划管理、发布管理、文档管理、事务管理等功能,在一个软件中就可以将软件研发中的需求、任务、bug、用例、计划、发布等要素有序的跟踪管理起来,完整地覆盖了项目管理的核心流程。

    11 引用 • 15 回帖
  • Unity

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

    27 引用 • 7 回帖 • 93 关注
  • Python

    Python 是一种面向对象、直译式电脑编程语言,具有近二十年的发展历史,成熟且稳定。它包含了一组完善而且容易理解的标准库,能够轻松完成很多常见的任务。它的语法简捷和清晰,尽量使用无异义的英语单词,与其它大多数程序设计语言使用大括号不一样,它使用缩进来定义语句块。

    561 引用 • 677 回帖
  • Caddy

    Caddy 是一款默认自动启用 HTTPS 的 HTTP/2 Web 服务器。

    10 引用 • 54 回帖 • 174 关注
  • Sublime

    Sublime Text 是一款可以用来写代码、写文章的文本编辑器。支持代码高亮、自动完成,还支持通过插件进行扩展。

    10 引用 • 5 回帖 • 1 关注
  • 脑图

    脑图又叫思维导图,是表达发散性思维的有效图形思维工具 ,它简单却又很有效,是一种实用性的思维工具。

    40 引用 • 157 回帖
  • 互联网

    互联网(Internet),又称网际网络,或音译因特网、英特网。互联网始于 1969 年美国的阿帕网,是网络与网络之间所串连成的庞大网络,这些网络以一组通用的协议相连,形成逻辑上的单一巨大国际网络。

    99 引用 • 367 回帖
  • 开源

    Open Source, Open Mind, Open Sight, Open Future!

    421 引用 • 3610 回帖
  • OpenCV
    15 引用 • 36 回帖 • 1 关注
  • 知乎

    知乎是网络问答社区,连接各行各业的用户。用户分享着彼此的知识、经验和见解,为中文互联网源源不断地提供多种多样的信息。

    10 引用 • 66 回帖
  • CloudFoundry

    Cloud Foundry 是 VMware 推出的业界第一个开源 PaaS 云平台,它支持多种框架、语言、运行时环境、云平台及应用服务,使开发人员能够在几秒钟内进行应用程序的部署和扩展,无需担心任何基础架构的问题。

    4 引用 • 16 回帖 • 198 关注
  • OneDrive
    2 引用 • 2 关注
  • 资讯

    资讯是用户因为及时地获得它并利用它而能够在相对短的时间内给自己带来价值的信息,资讯有时效性和地域性。

    56 引用 • 85 回帖 • 1 关注
  • SendCloud

    SendCloud 由搜狐武汉研发中心孵化的项目,是致力于为开发者提供高质量的触发邮件服务的云端邮件发送平台,为开发者提供便利的 API 接口来调用服务,让邮件准确迅速到达用户收件箱并获得强大的追踪数据。

    2 引用 • 8 回帖 • 545 关注
  • Oracle

    Oracle(甲骨文)公司,全称甲骨文股份有限公司(甲骨文软件系统有限公司),是全球最大的企业级软件公司,总部位于美国加利福尼亚州的红木滩。1989 年正式进入中国市场。2013 年,甲骨文已超越 IBM,成为继 Microsoft 后全球第二大软件公司。

    107 引用 • 127 回帖 • 329 关注