下面我们来看一页一页滑动的介绍页面如何实现。

首先在WkyLib工程中定义应用介绍基类WkyAppTourActivity,在本类中,我们用ViewPager来实现介绍页面一页一页滑动的功能。该Activity的布局文件如下所示:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical" ><LinearLayoutandroid:id="@+id/linearLayout01"android:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="vertical" ><android.support.v4.view.ViewPagerandroid:id="@+id/tourPages"android:layout_width="match_parent"android:layout_height="wrap_content" /></LinearLayout><RelativeLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:layout_marginBottom="20dp"android:orientation="vertical" ><LinearLayoutandroid:id="@+id/stepBar"android:layout_width="match_parent"android:layout_height="40dp"android:layout_alignParentBottom="true"android:gravity="center"android:orientation="horizontal" ></LinearLayout></RelativeLayout></FrameLayout>

我们首先在WkyAppTourActivity类中定义需要用到的属性,我们将介绍页面的ID保存在images中,而对应的ImageView保存在imageViews中,然后用一个ViewGroup来进行管理,而最后一页进入应用也是一介单独的ImageView。

 protected WkyApplication application = null; protected ViewPager tourPages;protected List<ImageView> imageViews;// 包裹小圆点的LinearLayoutprotected ViewGroup stepBar;protected ImageView enterAppImgv;protected int[] images = null;

因为每个应用所用的介绍图片都不相同,所以在WkyAppTourActivity类中定义了抽象方法prepareImages方法,该方法是将介绍页面的ID保存到images中:

/*** 实例化的应用程序通过定义本函数,将引导页面存入images里面*/abstract protected void prepareImages();

这个方法在每个具体应用的AppTourActivity中必须实现。

下面是WkyAppTourActivity类的onCreate函数:

@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_app_intro);getViewObjects();setupActionListeners();prepareImages();setupTourImages();}/*** 获取页面所有View,并赋给相应的属性,与IOS中IBOutlets类似*/private void getViewObjects() {imageViews = new ArrayList<ImageView>();stepBar = (ViewGroup) findViewById(R.id.stepBar);tourPages = (ViewPager) findViewById(R.id.tourPages);     }/*** 设定界面中操作的消息响应函数,与IOS中IBAction类似*/private void setupActionListeners() {tourPages.setOnPageChangeListener(new TourPageChangeListener());}/*** 设置介绍页面,介绍页面下面表示进度的圆点*/private void setupTourImages() {for (int i = 0; i < images.length; i++) {ImageView imageView = new ImageView(this);LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,LinearLayout.LayoutParams.WRAP_CONTENT);lp.setMargins(14, 0, 14, 0);imageView.setLayoutParams(lp);// imageView.setPadding(20, 0, 20, 0);imageViews.add(imageView);if (i == 0) {// 默认选中第一张图片imageViews.get(i).setBackgroundResource(R.drawable.page_indicator_focused);} else {imageViews.get(i).setBackgroundResource(R.drawable.page_indicator);}stepBar.addView(imageViews.get(i));}tourPages.setAdapter(new TourPageAdapter());        }

onCreate方法的代码并不复杂,首先设置布局,然后获取页面中需要进行操作的View,然后是设置页面事件响应函数,最后是生成与介绍页面相同数量的空ImageView对象,并将其加入ViewGroup中进行管理。

顺便提一句,上述代码全部加在onCreate方法中也是可以的,但是,如果想要让代码可维护性增强,小函数更有优势,而且同一个函数中,语句最是同一层级的,这些编码规范虽然看似没什么用,但是当回头维护代码时,你就会体会到这样写的重要性了。

下面是实现介绍图片一页一页滑动的ViewPager类及其实现:

 // 指引页面数据适配器class TourPageAdapter extends PagerAdapter {@Overridepublic int getCount() {return images.length;}@Overridepublic boolean isViewFromObject(View arg0, Object arg1) {return arg0 == arg1;}@Overridepublic int getItemPosition(Object object) {return super.getItemPosition(object);}@Overridepublic void destroyItem(ViewGroup container, int arg1, Object object) {container.removeView((View) object);}@Overridepublic Object instantiateItem(ViewGroup container, int position) {View view = createView(position);container.addView(view, 0);return view;}@SuppressWarnings("deprecation")private View createView(int position) {LayoutInflater mLayoutInflater = getLayoutInflater();View view = mLayoutInflater.inflate(R.layout.app_tour_view_pager, null);ImageView appTourImgv = (ImageView) view.findViewById(R.id.appTourImgv);enterAppImgv = (ImageView) view.findViewById(R.id.enterAppImgv);appTourImgv.setImageResource(images[position]);WkyLayoutAdapter.setRectangleView(appTourImgv, 0.6141f);if (position == images.length - 1) {WkyLayoutAdapter.setRectangleView(enterAppImgv, 0.1179f, 1.2835f);WkyLayoutAdapter.setViewMargin(enterAppImgv, 0.2017f);enterAppImgv.setVisibility(View.VISIBLE);enterAppImgv.setOnClickListener(mOnClickListener);}return view;}/*** 进入应用ImageView的点击响应函数,由于是第一次运行,进入注册登录页面* 1. 将firstRun置为false,下次应用启动将不再显示介绍页面* 2. 进入注册登录页面*/private View.OnClickListener mOnClickListener = new OnClickListener() {           @Overridepublic void onClick(View v) {finishAppTour();}};@Overridepublic void restoreState(Parcelable arg0, ClassLoader arg1) {}@Overridepublic Parcelable saveState() {return null;}@Overridepublic void startUpdate(View arg0) {}@Overridepublic void finishUpdate(View arg0) {}}

上面代码都比较简单,只是重点说一下onCreateView,页面中有一个介绍图片appTourImgv和一个进入应用的图片按钮enterAppImgv,当要显示某个介绍图片时,从images中找到ID,然后赋给appTourImgv来显示,如果是最后一张图片,将enterAppImgv置为可见,用户点击后调用finishAppTour方法。

/*** 进入注册登录页面*/abstract protected void goRegisterLoginActivity(); /*** 由于是第一次运行,进入注册登录页面* 1. 将firstRun置为false,下次应用启动将不再显示介绍页面* 2. 进入注册登录页面*/protected void finishAppTour() {application.setFirstRunToFalse();goRegisterLoginActivity();}

由于每个具体应用的注册登录页面可能不同,因此定义了抽象方法goRegisterLoginActivity方法,具体应用中必须实现这个方法。
下面是处理ViewPager页面滑动的事件响应函数:

 class TourPageChangeListener implements OnPageChangeListener {@Overridepublic void onPageScrollStateChanged(int arg0) {}@Overridepublic void onPageScrolled(int arg0, float arg1, int arg2) {}@Overridepublic void onPageSelected(int arg0) {if (arg0 == imageViews.size()) {finishAppTour();} else {for (int i = 0; i < imageViews.size(); i++) {imageViews.get(arg0).setBackgroundResource(R.drawable.page_indicator_focused);if (arg0 != i) {imageViews.get(i).setBackgroundResource(R.drawable.page_indicator);}}}}}

这里的处理逻辑比较简单,如果是在最后一页还向后翻页,就直接进入注册登录页面,如果不是的话,更新下页代表进度的小圆点,表示当前已经浏览到第几张。

还有界面调整工具类和常量存储的工具类,这里由于篇幅问题就不再贴上代码了,我们找一个下载地址,提供完整工程的下载,这样大家就可以看到完整的代码了。

下面是具体工程WkgJys,我们定义WkyAppTourActivity类的子类JysAppTourActivity类:

public class JysAppTourActivity extends WkyAppTourActivity {@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);application = (JysApplication)getApplication();}/*** 启动注册登录页面,并关闭本页* 【闫涛 2015.09.11】初始版本*/@Overrideprotected void goRegisterLoginActivity() {Intent intent = new Intent(this, MainActivity.class);startActivity(intent);finish();}/*** 定义介绍页面,将ID保存到images数组中* 【闫涛 2015.09.11】初始版本*/@Overrideprotected void prepareImages() {images = new int [5];images[0] = R.drawable.app_tour_01;images[1] = R.drawable.app_tour_02;images[2] = R.drawable.app_tour_03;images[3] = R.drawable.app_tour_04;images[4] = R.drawable.app_tour_05;}}

好了,大家运行程序,如果一切顺利的话,就可以看到多数应用具有的介绍页面了。

华丽的分隔线
******************************************************************************************************************************************************************************
希望大家多支持,有大家的支持,我才能走得更远,谢谢!
银行账号:622202 0200 1078 56128 闫涛
我的支付宝:yt7589@hotmail.com

最老程序员开发实训10--Android---应用介绍页面实现2相关推荐

  1. 程序员开发指南!半路出家Android程序员看我轻松逆袭!实战篇

    前言 不清楚你是不是知道,咱们中国有相当大的一部分软件公司,他们的软件开发团队都小的可怜,甚至只有1-3个人,连一个项目小组都算不上,而这样的团队却要承担一个软件公司所有的软件开发任务,在软件上线和开 ...

  2. Android实训内容及过程,Android项目开发实训大纲.doc

    Android项目开发实训大纲Android项目开发实训大纲 黎明职业大学信息与电子工程学院 <Android项目开发> 实训指导书 2014年6月 <Android项目开发> ...

  3. 最老程序员创业开发实训---30+程序员的希望

    我想做一个培训,主要想针对30+的程序员.因为这类程序员普遍存在着职业生涯的迷茫,想转做管理,但是一将成名万骨枯,十个中有一个就不错了:想去做销售,可是成天面对计算机,人际交往能力严重退化,想到要做到 ...

  4. BAT老程序员分享:Linux C/C++ 开发程序员的黄金方向和学习路线!

    目前从事 Linux C/C++ 开发的程序员很多,尤其是像百度.腾讯.阿里这样的大公司,他们的网站流量巨大,业务逻辑复杂,会遇到很多瓶颈,需要开发底层服务来提高程序效率,快速响应用户请求. 这些公司 ...

  5. 老程序员的10条中肯建议

    以下十条建议是一个老程序员给出的建议,句句中肯,希望能引起你的思考,而不是笑笑就过去了.觉得在理,不妨随手点赞收藏转发分享,谢谢~ 程序员的二八定律: 程序员的二八定律(这个图是我自己做的) 1.想清 ...

  6. 来自老程序员的10条中肯建议

    以下十条建议是一个老程序员给出的建议,句句中肯,希望能引起你的思考,而不是笑笑就过去了. 觉得在理,不妨随手点赞收藏转发分享,谢谢~ 程序员的二八定律: 1.想清楚,再动手写代码 刚入行的新手,为了展 ...

  7. java坦克大战 实训报告_坦克大战系统《Java程序开发实训》综合实训报告.doc

    坦克大战系统<Java程序开发实训>综合实训报告 <Java程序开发实训>综合实训报告 题目: 坦克大战系统 姓名: 方庆 学号: 2010203206 班级: 10软件(2) ...

  8. 工作10以上老程序员都去哪了?作为新时代的程序员我们该何去何从

    在纽约,PyGotham每年召开之际,都会有超过600名程序员聚集在一起讨论工作. 为了让会议更加多元化,组织者尽量邀请一些女性程序员以及各种肤色的程序员. 那么,老程序员都去哪了?他们去了大学教书, ...

  9. 8年web前端开发老程序员告诉你如何零基础学习web前端

    随着web前端的飞速发展,学习web前端的人员也是越来越多,在移动 互联网 时代,相信我们每个人的手机上都装有数十个APP,这些APP的开发其实也和当下热门的 Web 前端开发息息相关. 事实上,如今 ...

最新文章

  1. web前端开发培训完就业前景怎么样
  2. 二叉树的建立和递归遍历
  3. SprintBoot中JPA的使用
  4. [转] 前端中的MVC
  5. es6(五):函数的扩展
  6. neu1250矩阵快速幂哪~~
  7. 基于 arm 设计开发工具包的 Arm Cortex-M3 处理器的示例系统级设计(第一章:文件目录AHB组件开发平台)
  8. WCF 4.0 进阶系列 – 第十六章 使用回调合约发布和订阅事件(第二部分)
  9. nginx限制ip访问(转)
  10. dojochina ExtJS视频解压密码
  11. 好用的eclipse快捷键
  12. 使用MongoDb连接数据库服务器
  13. 编程开发之--设计模式
  14. hsqldb 的简单使用
  15. Protobuf版本下载地址
  16. 2021年起重机司机(限桥式起重机)考试题及起重机司机(限桥式起重机)免费试题
  17. 透过全球首个知识增强千亿大模型,看到中国AI差异化发展之路
  18. 仿25ge封装的APP封装源码-可以封装安卓和IOS
  19. oracle数据表空间与数据文件,oracle的表空间及数据文件
  20. 阅读整理笔记,正能量

热门文章

  1. 起泡法排序,从小到大顺序排列
  2. 四旋翼无人机学习第12节--跨页连接符的标号设置、DRC、PDF导出
  3. 解密DeathStalker
  4. Matlab学习-常用命令技巧
  5. Image-Image Translation to Enhance Near Infrared Face Recognition阅读笔记
  6. 阿里:不清除35岁以上的P8员工!
  7. Android 注解Annotation及在流行框架中使用的原理
  8. 晋级 7 问 - 技术晋级答辩中常见问题解析
  9. opencv Subdiv2D.insert() 报错
  10. 2016集训队论文姜志豪