您的位置:首页 > 其它

HorizontalScrollView实现多页左右滑动

2015-11-11 15:22 651 查看
先上图看看效果:



上代码:

PageView是封装后的一个类,继承了HorizontalScrollView。

[java] view
plaincopy





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:

[html] view
plaincopy





<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里面调用就行。

[java] view
plaincopy





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);  

    }  

}  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息