先上图看看效果:
上代码:
PageView是封装后的一个类,继承了HorizontalScrollView。
- package com.miquan;
- import android.content.Context;
- import android.util.AttributeSet;
- import android.util.DisplayMetrics;
- import android.view.MotionEvent;
- import android.view.View;
- import android.widget.HorizontalScrollView;
- import android.widget.LinearLayout;
- /**
- * 具体看博客:http://blog.csdn.net/qiantujava/article/details/42392127
- */
- public class PageView extends HorizontalScrollView {
- private int mBaseScrollX;//滑动基线。也就是点击并滑动之前的x值,以此值计算相对滑动距离。
- private int mScreenWidth;
- private int mScreenHeight;
- private LinearLayout mContainer;
- private boolean flag;
- private int mPageCount;//页面数量
- private int mScrollX = 200;//滑动多长距离翻页
- public PageView(Context context, AttributeSet attrs) {
- super(context, attrs);
- DisplayMetrics dm = context.getApplicationContext().getResources()
- .getDisplayMetrics();
- mScreenWidth = dm.widthPixels;
- mScreenHeight = dm.heightPixels;
- }
- /**
- * 添加一个页面到最后。
- * @param page
- */
- public void addPage(View page) {
- addPage(page, -1);
- }
- /**
- * 添加一个页面。
- * @param page
- */
- public void addPage(View page, int index) {
- if(!flag) {
- mContainer = (LinearLayout) getChildAt(0);
- flag = true;
- }
- LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(mScreenWidth, mScreenHeight);
- if(index == -1) {
- mContainer.addView(page, params);
- } else {
- mContainer.addView(page, index, params);
- }
- mPageCount++;
- }
- /**
- * 移除一个页面。
- * @param index
- */
- public void removePage(int index) {
- if(mPageCount < 1) {
- return;
- }
- if(index<0 || index>mPageCount-1) {
- return;
- }
- mContainer.removeViewAt(index);
- mPageCount--;
- }
- /**
- * 移除所有的页面
- */
- public void removeAllPages() {
- if(mPageCount > 0) {
- mContainer.removeAllViews();
- }
- }
- /**
- * 获取页面数量
- * @return
- */
- public int getPageCount() {
- return mPageCount;
- }
- /**
- * 获取相对滑动位置。由右向左滑动,返回正值;由左向右滑动,返回负值。
- * @return
- */
- private int getBaseScrollX() {
- return getScrollX() - mBaseScrollX;
- }
- /**
- * 使相对于基线移动x距离。
- * @param x x为正值时右移;为负值时左移。
- */
- private void baseSmoothScrollTo(int x) {
- smoothScrollTo(x + mBaseScrollX, 0);
- }
- @Override
- public boolean onTouchEvent(MotionEvent ev) {
- int action = ev.getAction();
- switch (action) {
- case MotionEvent.ACTION_UP:
- int scrollX = getBaseScrollX();
- //左滑,大于一半,移到下一页
- if (scrollX > mScrollX) {
- baseSmoothScrollTo(mScreenWidth);
- mBaseScrollX += mScreenWidth;
- }
- //左滑,不到一半,返回原位
- else if (scrollX > 0) {
- baseSmoothScrollTo(0);
- }
- //右滑,不到一半,返回原位
- else if(scrollX > -mScrollX) {
- baseSmoothScrollTo(0);
- }
- //右滑,大于一半,移到下一页
- else {
- baseSmoothScrollTo(-mScreenWidth);
- mBaseScrollX -= mScreenWidth;
- }
- return true;
- }
- return super.onTouchEvent(ev);
- }
- }
接下来是布局,fragment_main.xml:
- <LinearLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- >
- <!-- pageview里面必须有LinearLayout,这个写死了。 -->
- <com.example.testandrid.PageView
- android:id="@+id/pageview"
- android:layout_width="wrap_content"
- android:layout_height="fill_parent"
- android:scrollbars="none" >
- <LinearLayout
- android:layout_width="wrap_content"
- android:layout_height="fill_parent"
- android:orientation="horizontal" >
- </LinearLayout>
- </com.example.testandrid.PageView>
- </LinearLayout>
最后在Activity里面调用就行。
- package com.example.testandrid;
- import android.app.Activity;
- import android.graphics.Color;
- import android.os.Bundle;
- import android.view.LayoutInflater;
- import android.widget.LinearLayout;
- public class MainActivity extends Activity {
- private LayoutInflater inflater;
- private PageView mPageView;
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.fragment_main);
- inflater = LayoutInflater.from(this);
- mPageView = (PageView) findViewById(R.id.pageview);
- //增加几个页面
- LinearLayout layout = new LinearLayout(this);
- layout.setBackgroundColor(Color.BLUE);
- mPageView.addPage(layout);
- LinearLayout layout2 = new LinearLayout(this);
- layout2.setBackgroundColor(Color.YELLOW);
- mPageView.addPage(layout2);
- //这里就是个普通的xml布局文件
- LinearLayout view = (LinearLayout) inflater.inflate(R.layout.page1, null);
- mPageView.addPage(view);
- //删除一个页面
- // mPageView.removePage(1);
- }
- }