首页 > 代码库 > Android自己定义控件实战——仿多看阅读平移翻页

Android自己定义控件实战——仿多看阅读平移翻页

    转载请声明出处http://blog.csdn.net/zhongkejingwang/article/details/38728119

之前自己做的一个APP须要用到翻页阅读,网上看过立体翻页效果,只是bug太多了还不兼容。看了一下多看阅读翻页是採用平移翻页的,于是就仿写了一个平移翻页的控件。效果例如以下:

技术分享

在翻页时页面右边缘绘制了阴影。效果还不错。要实现这样的平移翻页控件并不难,仅仅须要定义一个布局管理页面就能够了。

详细实现上有下面难点:

    1、循环翻页,页面的反复利用。

    2、在翻页时过滤掉多点触碰。

    3、採用setAdapter的方式设置页面布局和数据。

以下就来一一解决这几个难点。首先看循环翻页问题,怎么样能採用较少的页面实现这样的翻页呢?因为屏幕上每次仅仅能显示一张完整的页面。翻过去的页面也看不到。所以能够把翻过去的页面拿来反复利用,不必每次都new一个页面,所以,我仅仅用了三张页面实现循环翻页。

要想反复利用页面。首先要知道页面在布局中序号和相应的层次关系。比方一个父控件的子view的序号越大就位于越上层。

循环利用页面的原理图例如以下:

向右翻页时状态图是这种,仅仅用了0、1、2三张页面,页面序号为2的位于最上层。我把它隐藏在左边,所以看到的仅仅有页面1,页面0在1以下挡着也看不到,向右翻页时,页面2被滑到屏幕中,这时候把页面0的内容替换成页面2的前一页内容。把它放到之前页面2的位置,这时。状态又回到了初始状态,又能够继续向右翻页了!

技术分享

向左翻页时是这种,初始状态还是一样,当页面1被往左翻过时,看到的是页面0,这时候页面0以下已经没有页面了,而页面2已经用不到了,这时候把页面2放到页面0以下。这时候状态又回到了初始状态,就能够继续往左翻页了。

技术分享

类似于这样的循环效果的实现我一直用的解决方式都是将选中的置于最中间,比方原理图中的页面1。每次翻页完毕后可见的都是页面1。在滚动选择器PickerView中也是相同的方案。这就攻克了页面的反复利用问题了。

解决难点2 翻页时过滤多点触碰这个问题在仿淘宝商品浏览界面中已经解决过了,就是用一个控制变量mEvents过滤掉pointer down或up后到来的第一个move事件。

解决难点3 採用adapter方式设置页面的布局和数据。

这个在Android的AdapterView里用到的。可是我没有看它的adapter机制,太复杂了,我就搞了个简单的adapter,例如以下:

PageAdapter.java:

package com.jingchen.pagerdemo;

import android.view.View;

public abstract class PageAdapter
{
	/**
	 * @return 页面view
	 */
	public abstract View getView();

	public abstract int getCount();

	/**
	 * 将内容加入到view中
	 * 
	 * @param view
	 *            包括内容的view
	 * @param position
	 *            第position页
	 */
	public abstract void addContent(View view, int position);
}
这是一个抽象类,getView()用于返回页面的布局,getCount()返回数据总共须要多少页。addContent(View view, int position)这个是每翻过一页后将会被调用来请求页面数据的,參数view就是页面,position是表明第几页。

待会儿会在自己定义布局中定义setAdapter方法设置设配器。

    OK,难点都攻克了,自己定义一个布局叫ScanView继承自RelativeLayout:

ScanView.java:

Android自己定义控件实战——仿多看阅读平移翻页