`
aliusa
  • 浏览: 83874 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

让scrollview在滚动的过程中自动定位页的边边

阅读更多
/**
 * The Class PageScrollView, we can scroll the pages in this component.
 */
public class PageScrollView extends LinearLayout {

    /** The context. */
    private Context mContext;
    
    /** The adapter used to get the view of each page. */
    private BaseAdapter mAdapter;
    
    /** The page count. */
    private int mPageCount = 0;
    
    /** The current page index. */
    private int mCurrPageIndex = 0;
    
    /** The scroll view in this component. */
    private HorizontalScrollView mScrollView;
    
    /** The target parent view for each page. */
    private LinearLayout mPageContent;
    
    /** The velocity tracker. */
    private VelocityTracker mVelocityTracker;
    
    /** The width for each page. */
    private int mWidth;
    
    /** The maximum velocity. */
    private int mMaximumVelocity;
    
    /** The change. */
    private boolean mChange = false;
    
    /** The Constant SNAP_VELOCITY. */
    private static final int SNAP_VELOCITY = 500;
    
    /** The Constant PAGE_FACTOR. */
    private static final int PAGE_FACTOR = 3;

    /** The units parameter for velocity. */
    private static final int VELOCITY_UNITS = 1000;

    /**
     * Instantiates a new page scroll view.
     *
     * @param context the context
     */
    public PageScrollView(Context context) {
        super(context);
        mContext = context;
    }

    /**
     * Instantiates a new page scroll view.
     *
     * @param context the context
     * @param attrs the attrs
     */
    public PageScrollView(Context context, AttributeSet attrs) {
        super(context, attrs);
        mContext = context;
    }

    /**
     * Sets the adapter.
     *
     * @param adapter the adapter
     * @param with the with for each page
     */
    public void setAdapter(BaseAdapter adapter, int with) {
        if (adapter == null) {
            return;
        }

        mAdapter = adapter;
        mWidth = with;
        initUI();
        bindLayoutUI();
    }

    /**
     * Inits the ui.
     */
    private void initUI() {
        this.removeAllViews();

        mScrollView = new HorizontalScrollView(mContext);
        mScrollView.setHorizontalScrollBarEnabled(false);
        mScrollView.setLayoutParams(new ViewGroup.LayoutParams(
                ViewGroup.LayoutParams.FILL_PARENT,
                ViewGroup.LayoutParams.FILL_PARENT));

        mPageContent = new LinearLayout(mContext);
        mPageContent.setLayoutParams(new LinearLayout.LayoutParams(
                LinearLayout.LayoutParams.FILL_PARENT,
                LinearLayout.LayoutParams.FILL_PARENT));
        //mPageContent.setGravity(Gravity.CENTER);
        mPageContent.setOrientation(HORIZONTAL);

        mScrollView.setOnTouchListener(mTouchListener);
        this.addView(mScrollView);
        mScrollView.addView(mPageContent);

        // FIXME: width is a problem sometimes!
        final LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) this.getLayoutParams();
        if (!(lp.width == LinearLayout.LayoutParams.FILL_PARENT
                || lp.width == LinearLayout.LayoutParams.WRAP_CONTENT)) {
            mWidth = lp.width;
        }

        final ViewConfiguration configuration = ViewConfiguration.get(mContext);
        mMaximumVelocity = configuration.getScaledMaximumFlingVelocity();
    }

    /**
     * Bind layout ui, add pages to this component.
     */
    private void bindLayoutUI() {
        mPageCount = mAdapter.getCount();

        final LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
                mWidth, LinearLayout.LayoutParams.FILL_PARENT);
       // params.gravity = Gravity.CENTER;
        for (int i = 0; i < mPageCount; i++) {
            final View v = mAdapter.getView(i, null, null);
            mPageContent.addView(v, params);
        }
    }

    /**
     * Gets the current page index.
     *
     * @return the current page index
     */
    public int getCurrentPageIndex() {
        return mCurrPageIndex;
    }

    /** The m touch listener. */
    private View.OnTouchListener mTouchListener = new View.OnTouchListener() {

        @Override
        public boolean onTouch(View v, MotionEvent event) {
            final int action = event.getAction();

            if (mVelocityTracker == null) {
                mVelocityTracker = VelocityTracker.obtain();
            }
            mVelocityTracker.addMovement(event);

            switch (action) {
            case MotionEvent.ACTION_UP: 

                final VelocityTracker velocityTracker = mVelocityTracker;
                    velocityTracker.computeCurrentVelocity(VELOCITY_UNITS, mMaximumVelocity);
                    final int velocityX = (int) velocityTracker.getXVelocity();
                    final int scrollX = mScrollView.getScrollX();
                    final int deltaX = (int) (scrollX - mCurrPageIndex * mWidth);
                    if (((velocityX > SNAP_VELOCITY) || (deltaX < -mWidth / PAGE_FACTOR))
                            && mCurrPageIndex > 0) {
                        mCurrPageIndex -= 1;
                        mChange = true;
                        
                    } else if (((velocityX < -SNAP_VELOCITY) || (deltaX > mWidth / PAGE_FACTOR))
                            && mCurrPageIndex < (mPageCount - 1)) {
                        mCurrPageIndex += 1;
                        mChange = true;
                    }
                    mScrollView.smoothScrollTo(mCurrPageIndex * mWidth, 0);
                    if (mChange) {
                        if (mOnPageChangeListener != null) {
                            mOnPageChangeListener.onPageChange();
                        }
                        mChange = false;
                    }
                    if (mVelocityTracker != null) {
                    mVelocityTracker.recycle();
                    mVelocityTracker = null;
                }
                return true; // break;
                default:
                    break;
            }
            return false;
        }
    };

    /**
     * The listener interface for receiving onPageChange events.
     * The class that is interested in processing a onPageChange
     * event implements this interface, and the object created
     * with that class is registered with a component using the
     * component's <code>addonPageChangeListener<code> method. When
     * the onPageChange event occurs, that object's appropriate
     * method is invoked.
     *
     * @see onPageChangeEvent
     */
    public interface OnPageChangeListener {
        
        /**
         * On page change.
         */
        void onPageChange();
    }

    /** The m on page change listener. */
    private OnPageChangeListener mOnPageChangeListener;

    /**
     * Sets the on page change listener.
     *
     * @param l the new on page change listener
     */
    public void setOnPageChangeListener(OnPageChangeListener l) {
        mOnPageChangeListener = l;
    }
    
    /**
     * Sets the page index.
     *
     * @param index the new page index
     */
    public void setPageIndex(int index) {
        if (index < 0 || index > mPageCount - 1 || index == mCurrPageIndex) {
            return;
        }
        
        mCurrPageIndex = index;
        mScrollView.smoothScrollTo(mCurrPageIndex * mWidth, 0);
    }
}
分享到:
评论
2 楼 康妮西 2011-06-09  
求这个View的解释

望博主联系,我的联系方式:

kangnixi@gmail.com 或 QQ: 1047286578
1 楼 muyu114 2011-05-16  
你这个是啥意思啊,有什么效果没有

相关推荐

    SCrollView自动滚动视图

    在ScrollView滚动时,我们可以更新UIPageControl的currentPage属性,让用户知道当前显示的是哪一页。在"UIPageControlDemo"这个项目文件中,很可能包含了如何将ScrollView和UIPageControl结合使用的示例代码。 在...

    scrollView自动循环滚动

    而在自动滚动过程中,如果检测到用户开始滑动,则暂停自动滚动。 在实际开发中,我们还可以添加一些额外的功能,比如添加页码指示器,显示当前显示的是第几张图片;或者添加动画效果,让图片的切换更自然流畅。此外...

    ScrollView自动滚动

    本篇文章将深入探讨如何在Android中实现ScrollView的自动滚动,并结合“ScrollView自动滚动”这一主题,解析相关知识点。 首先,我们要了解ScrollView的基本用法。ScrollView是一个可以包含单个垂直布局的容器,它...

    ScrollView 的滚动事件监听

    在Android开发中,ScrollView是一个非常常见的布局控件,它允许用户在单个屏幕上滚动查看超过一屏幕内容的视图。ScrollView通常用于包含多个其他视图,如TextView、ImageView或者LinearLayout等,以提供垂直滚动功能...

    ScrollView循环滚动

    3. **平滑过渡**:为了使滚动看起来平滑,我们需要在滚动过程中隐藏或显示复制的视图,确保滚动过程中的内容切换不突兀。 4. **监听器和回调**:可以设置一个滚动监听器,当滚动到一定位置时触发回调,更新数据显示...

    Android ScrollView+GridView左右滑动 自动定位滑动到某一项

    在ScrollView中嵌套GridView时,需要注意避免冲突,因为两者都有滚动功能,合理配置可以使用户体验更佳。 接下来,我们关注GridView。GridView是基于Adapter的控件,它可以动态加载数据并将其组织成网格形式。每个...

    scrollView自动滚动

    在Swift中,我们可以使用`UIView.animate(withDuration:)`方法来平滑地改变`contentOffset`,实现自动滚动效果。例如: ```swift UIView.animate(withDuration: 1.0) { self.scrollView.contentOffset = CGPoint(x...

    Scrollview的自动滚动

    显示dialog, Scrollview自动滚动

    安卓scrollview动画滚动到顶部

    在Android开发中,ScrollView是一个非常常用的布局控件,它允许用户在内容超出屏幕时通过滚动查看更多的信息。本文将深入探讨如何实现一个ScrollView动画滚动到顶部的功能,这在很多应用场景中都非常有用,例如用户...

    WPF的scrollview滚动条设置及上一页下一页设置

    在本教程中,我们将深入探讨如何设置ScrollViewer的滚动条以及如何实现上一页、下一页的功能。 首先,让我们了解ScrollViewer的基本用法。ScrollViewer是一个可以嵌套其他控件的容器,当其内容超出边界时,会自动...

    ScrollView缓慢滚动到指定位置的标准自定义

    然而,当需要让ScrollView平滑地滚动到特定位置时,标准的`scrollTo()`方法可能会表现出不理想的效果,因为它会立即跳转到指定位置,缺乏平滑过渡,这在用户体验上可能显得生硬。本篇将详细介绍如何实现ScrollView...

    Android双向滚动ScrollView

    在Android开发中,ScrollView是常用的布局控件,用于实现单向滚动,但有时我们需要实现一个可以双向滚动的视图,这就涉及到了自定义组件的知识。本文将深入解析如何实现一个支持垂直和水平双向滚动的ScrollView。 ...

    swift-ScrollView无限滚动支持定时器轮播图

    ScrollView是iOS中用于展示可滚动内容的基础控件,它可以容纳多个视图并允许用户上下左右滚动查看。实现ScrollView的无限滚动,关键在于正确设置其内容尺寸和滚动方向,以及在适当的时候重用视图以节省内存。 为了...

    Unity嵌套滚动ScrollView.zip

    本项目“Unity嵌套滚动ScrollView.zip”着重探讨了如何在Unity中实现ScrollView的嵌套,即在一个ScrollView内嵌入另一个ScrollView,以创建横竖滑动的复杂布局。 首先,我们关注的核心文件是"CustomScrollRect.cs...

    ScrollView滚动条循环.unitypackage

    unity UGUI ScrollView 滚动条循环开发插件 ,

    Unity滚动条ScrollView自动居中、缩放、变暗扩展

    在Unity引擎中,滚动条(ScrollView)是一种常用的游戏界面元素,尤其在实现列表或轮播图等场景中不可或缺。本文将深入探讨如何实现"Unity滚动条ScrollView自动居中、缩放、变暗扩展"这一技术。 首先,让我们理解...

    scrollView循环滚动

    在iOS开发中,`UIScrollView` 是一个非常重要的控件,它允许用户在内容超过视图范围时滚动查看。"scrollView循环滚动"这个话题涉及到如何使`UIScrollView`的内容无限循环,就像一个轮播图或者瀑布流展示那样。这种...

    iOS ScrollView嵌套tableView联动滚动的思路与最佳实践

    对应这种页面结构应该毫无疑问是最底层是一个纵向滚动的scrollView,它的页面上面放一个固定高度的header,紧接着下面一个支持横向滚动切换的容器scrollView,容器上面才是各个页面具体的tableView,如下图: ...

    自动循环滚动scrollView

    在创建“自动循环滚动”的`UIScrollView`时,我们需要实现两个主要功能:一是让`UIScrollView`自动滚动,二是实现内容的无缝循环。 首先,自动滚动通常是通过定时器(`NSTimer`或`CADisplayLink`)来实现的。我们...

    判断scrollView滚动结束

    重写scrollView的onTouchEvent事件,在MotionEvent.ACTION_CANCEL和MotionEvent.ACTION_UP中通过反射获取scrollview中的OverScroller,然后获取OverScroller的状态判断scrollview是否结束滚动

Global site tag (gtag.js) - Google Analytics