开源库 AppIntro

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

分享歌曲

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

相关帖子

欢迎来到这里!

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

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

推荐标签 标签

  • RYMCU

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

    4 引用 • 6 回帖 • 53 关注
  • CSDN

    CSDN (Chinese Software Developer Network) 创立于 1999 年,是中国的 IT 社区和服务平台,为中国的软件开发者和 IT 从业者提供知识传播、职业发展、软件开发等全生命周期服务,满足他们在职业发展中学习及共享知识和信息、建立职业发展社交圈、通过软件开发实现技术商业化等刚性需求。

    14 引用 • 155 回帖
  • HBase

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

    17 引用 • 6 回帖 • 61 关注
  • Word
    13 引用 • 40 回帖
  • Hexo

    Hexo 是一款快速、简洁且高效的博客框架,使用 Node.js 编写。

    22 引用 • 148 回帖 • 12 关注
  • 数据库

    据说 99% 的性能瓶颈都在数据库。

    345 引用 • 742 回帖
  • Spark

    Spark 是 UC Berkeley AMP lab 所开源的类 Hadoop MapReduce 的通用并行框架。Spark 拥有 Hadoop MapReduce 所具有的优点;但不同于 MapReduce 的是 Job 中间输出结果可以保存在内存中,从而不再需要读写 HDFS,因此 Spark 能更好地适用于数据挖掘与机器学习等需要迭代的 MapReduce 的算法。

    74 引用 • 46 回帖 • 568 关注
  • OpenShift

    红帽提供的 PaaS 云,支持多种编程语言,为开发人员提供了更为灵活的框架、存储选择。

    14 引用 • 20 回帖 • 654 关注
  • MySQL

    MySQL 是一个关系型数据库管理系统,由瑞典 MySQL AB 公司开发,目前属于 Oracle 公司。MySQL 是最流行的关系型数据库管理系统之一。

    693 引用 • 537 回帖 • 1 关注
  • InfluxDB

    InfluxDB 是一个开源的没有外部依赖的时间序列数据库。适用于记录度量,事件及实时分析。

    2 引用 • 87 关注
  • Quicker

    Quicker 您的指尖工具箱!操作更少,收获更多!

    36 引用 • 155 回帖
  • Ruby

    Ruby 是一种开源的面向对象程序设计的服务器端脚本语言,在 20 世纪 90 年代中期由日本的松本行弘(まつもとゆきひろ/Yukihiro Matsumoto)设计并开发。在 Ruby 社区,松本也被称为马茨(Matz)。

    7 引用 • 31 回帖 • 250 关注
  • 阿里巴巴

    阿里巴巴网络技术有限公司(简称:阿里巴巴集团)是以曾担任英语教师的马云为首的 18 人,于 1999 年在中国杭州创立,他们相信互联网能够创造公平的竞争环境,让小企业通过创新与科技扩展业务,并在参与国内或全球市场竞争时处于更有利的位置。

    43 引用 • 221 回帖 • 71 关注
  • IDEA

    IDEA 全称 IntelliJ IDEA,是一款 Java 语言开发的集成环境,在业界被公认为最好的 Java 开发工具之一。IDEA 是 JetBrains 公司的产品,这家公司总部位于捷克共和国的首都布拉格,开发人员以严谨著称的东欧程序员为主。

    181 引用 • 400 回帖
  • App

    App(应用程序,Application 的缩写)一般指手机软件。

    91 引用 • 384 回帖
  • 书籍

    宋真宗赵恒曾经说过:“书中自有黄金屋,书中自有颜如玉。”

    78 引用 • 396 回帖
  • Gitea

    Gitea 是一个开源社区驱动的轻量级代码托管解决方案,后端采用 Go 编写,采用 MIT 许可证。

    5 引用 • 16 回帖
  • JSON

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

    52 引用 • 190 回帖
  • 互联网

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

    99 引用 • 367 回帖
  • OneDrive
    2 引用
  • NGINX

    NGINX 是一个高性能的 HTTP 和反向代理服务器,也是一个 IMAP/POP3/SMTP 代理服务器。 NGINX 是由 Igor Sysoev 为俄罗斯访问量第二的 Rambler.ru 站点开发的,第一个公开版本 0.1.0 发布于 2004 年 10 月 4 日。

    315 引用 • 547 回帖
  • Python

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

    556 引用 • 675 回帖
  • 印象笔记
    3 引用 • 16 回帖
  • 京东

    京东是中国最大的自营式电商企业,2015 年第一季度在中国自营式 B2C 电商市场的占有率为 56.3%。2014 年 5 月,京东在美国纳斯达克证券交易所正式挂牌上市(股票代码:JD),是中国第一个成功赴美上市的大型综合型电商平台,与腾讯、百度等中国互联网巨头共同跻身全球前十大互联网公司排行榜。

    14 引用 • 102 回帖 • 317 关注
  • 笔记

    好记性不如烂笔头。

    310 引用 • 794 回帖
  • Angular

    AngularAngularJS 的新版本。

    26 引用 • 66 回帖 • 543 关注
  • 游戏

    沉迷游戏伤身,强撸灰飞烟灭。

    181 引用 • 821 回帖