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

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

首先在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" >

    <LinearLayout
        android:id="@+id/linearLayout01"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical" >

        <android.support.v4.view.ViewPager
            android:id="@+id/tourPages"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />
    </LinearLayout>

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_marginBottom="20dp"
        android:orientation="vertical" >

        <LinearLayout
            android: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;
	// 包裹小圆点的LinearLayout
	protected ViewGroup stepBar;
	protected ImageView enterAppImgv;
	protected int[] images = null;

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

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

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

下面是WkyAppTourActivity类的onCreate函数:

@Override
	public 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 {
		@Override
		public int getCount() {
			return images.length;
		}

		@Override
		public boolean isViewFromObject(View arg0, Object arg1) {
			return arg0 == arg1;
		}

		@Override
		public int getItemPosition(Object object) {
			return super.getItemPosition(object);
		}

		@Override
		public void destroyItem(ViewGroup container, int arg1, Object object) {
			container.removeView((View) object);
		}

		@Override
		public 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() {
			@Override
			public void onClick(View v) {
				finishAppTour();
			}
		};

		@Override
		public void restoreState(Parcelable arg0, ClassLoader arg1) {

		}

		@Override
		public Parcelable saveState() {
			return null;
		}

		@Override
		public void startUpdate(View arg0) {

		}

		@Override
		public 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 {
		@Override
		public void onPageScrollStateChanged(int arg0) {
		}

		@Override
		public void onPageScrolled(int arg0, float arg1, int arg2) {
		}

		@Override
		public 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 {
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		application = (JysApplication)getApplication();
	}

	/**
	 * 启动注册登录页面,并关闭本页
	 * 【闫涛 2015.09.11】初始版本
	 */
	@Override
	protected void goRegisterLoginActivity() {
		Intent intent = new Intent(this, MainActivity.class);
		startActivity(intent);
		finish();
	}

	/**
	 * 定义介绍页面,将ID保存到images数组中
	 * 【闫涛 2015.09.11】初始版本
	 */
	@Override
	protected 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 闫涛
我的支付宝:[email protected]

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-10 15:48:56

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

最老程序员开发实训9--Android---应用介绍页面实现1

在这一节中,我们回到Android端,讨论一下当应用第一次运行时,通常采用的一页一页滑动的介绍页面的实现方式. 首先,我们需要知道应用是否是第一次运行.判断应用是否是第一次运行,通常是应用持久化保存一个特定的信息,每次启动时检查是否有该信息,如果没有则代表第一次运行.对于信息的持久化存储,在Android平台,大约有三种方法,分别是SharedPreferences.文件.SQLite数据库,通常类似应用是否第一次运行这种小信息,一般会选择保存在SharedPreferences中. 我们首先在

Web程序员开发App系列 - 开发我的第一个App,源码下载

Web程序员开发App系列 Web程序员开发App系列 - 认识HBuilder Web程序员开发App系列 - 申请苹果开发者账号 Web程序员开发App系列 - 调试Android和iOS手机代码 Web程序员开发App系列 - 开发我的第一个App 待续 目录 前言 源码和App下载 准备工作 查看留言页面 增加留言页面 前言 看了前面几篇文章后我们终于要开始敲代码了,由于所有前端代码都是Html静态问题,所以你用什么开发工具都可以,后台我采用MVC开发,因为Html静态文件需要打包,里面

10年IT人生酸甜苦辣的经历!一个老程序员的心理话

10年IT人生酸甜苦辣的经历!一个老程序员的心理话 我始终认为,对一个初学者来说,IT界的技术风潮是不可以追赶的,而且也没有能力去追赶.我时常看见自己的DDMM们把课本扔了,去卖些价格不菲的诸如C#, VB.Net 这样的大部头,这让我感到非常痛心.而许多搞不清指针是咋回事的BBS站友眉飞色舞的讨论C#里面可以不用指针等等则让我觉得好笑.C#就象当年的ASP一样,“忽如一夜春风来,千树万树梨花开”,结果许多学校的信息学院成了“Web 学院”.96,97级的不少大学生都去做Web 了.当然我没有任

80. 投奔怒海——一个Domino老程序员眼里的Java开发

这是一个以键盘鼠标为谋生工具已十多年的人初次进行专门的Java开发的体验和感受,对于Java程序员,这些也许早就习以为常,那就把这当成从一个来自不同世界的新人眼里看看他们自己的工作:对于我的Domino同行,这些体验或许将来有更多共鸣的可能. 在加入到这个Java产品开发团队之前,我的Java开发经验如下:十几年前跟着一本Java入门书做练习写的几个Applet,Domino项目开发中写的几个读写数据库和外部邮件的代理,XPages开发中的少量Java Beans和一个流程库.除此之外就只剩下对

郑重告之:智能合约开发实训营第4期学员招募正式启动!

各位同学,抱歉久等了- 这是终于到来的<以太坊智能合约全栈开发>实战特训营第四期的正式招募通知. <以太坊智能合约全栈开发>实战特训营是由硅谷密探和 celer network 共同打造的全球第一档·智能合约全栈开发实战课程,也是目前唯一一个实现来自中.美.澳.英.日.韩等多国学员在线互动学习的区块链技术实战特训课程. 为了保证教学质量,如今已调整为每期仅招募100人,参与有门槛,需经过层层审核,录取通过率一度不到10%,并非所有人都适合参与. 拉至文末可直接进行报名. 请点击此处

老程序员应该记住的 5 件事

如果你甘于现状,并且已经在计划着怎么用退休金了,那么你不是这个帖子的主角.当然还是要恭喜你,已经快熬出头了.但是,如果你同我一样,尽管发现自己在变老,但却依然无法抵挡编码和构建东西的欲望,那么请继续往下看.我曾是一个系统软件工程师,但在我快40岁的时候,我被创业撞了一下腰.我认为创建自己的公司是一件很酷的事情.我建立了风险投资,在一些非常小的饥饿创业公司得到了一些花哨的头衔.我很自信我会成为一个好的CEO,一个不算坏的管理者,而且即便我不再编码,我也可以聘请一些优秀的程序员和管理人员——以求高品

老程序员的下场(转)

长期从事编程活动的程序员都期望在50多岁时能爬到一个足够高的职位,或者能顺利的退休. 但我在这里讨论的可能是一个你还没有想过的问题:如果到那时你失业了呢? 50多岁时你的职业仕途会成为一个问题.如果你有很好的技术,有人雇你,你会有一个很高的职衔,或你是一个专家,或有很好的人际关系,你都有可能找到一个新的职务. 否则,你会从衣食无忧沦落为无家可归.这是真的.我55岁,我的简历会让你感觉非常优秀,10年前我能挣到多达100万美元.现在我是一个流浪汉.我身体不是很好,没有医险,没有牙医.能找到的工作只

老程序员应该记住的5件事

英文原文:Five Things Old Programmers Should Remember 如果你甘于现状,并且已经在计划着怎么用退休金了,那么你不是这个帖子的主角.当然还是要恭喜你,已经快熬出头了.但是,如果你同我一样,尽管发现自己在变老,但却依然无法抵挡编码和构建东西的欲望,那么请继续往下看. 我曾是一个系统软件工程师,但在我快 40 岁的时候,我被创业撞了一下腰.我认为创建自己的公司是一件很酷的事情.我建立了风险投资,在一些非常小的饥饿创业公司得到了一些花哨的头衔.我很自信我会成为一

一个老程序员的心理话,句句戳心(转)

一个老程序员的心理话,句句戳心 码易-猿猿-yuan 2015-11-04 12:22:45 中国的程序员是世界上最好的程序员.他们不计报酬,没日没夜地工作.没有女朋友,没有节假日,可能几年后他们一无所有.他们仍在加班. 一些人总是发出一些错误的声音,形成了劣胜优汰可怕的现象.他们在误导着中国,把我们的后继军训练成软件蓝领――――胸无大志,目光短浅,稍有点成绩就自 满就自高自大的人,浑不知天外有天,外国正在虎视眈眈盯着中国的庞大市场. 由于软件蓝领的呼声人们不再致力于培养大批的高精尖人才,掌握国