安卓view滑动控件及方法scrollBy,scrollTo的使用

在Android View视图是没有边界的,Canvas是没有边界的,只不过我们通过绘制特定的View时对
Canvas对象进行了一定的操作,例如 : translate(平移)、clipRect(剪切)等,以便达到我们的对该Canvas对象绘制的要求 ,我们可以将这种无边界的视图称为“视图座标”—–它不受物理屏幕限制。通常我们所理解的一个Layout布局文件只是该视
图的显示区域,超过了这个显示区域将不能显示到父视图的区域中 ,对应的,我们可以将这种有边界的视图称为“布局座标” —— 父视图给子视图分配的布局(layout)大小。
mScrollX: 该视图内容相当于视图起始座标的偏移量, X轴方向
mScrollY: 该视图内容相当于视图起始座标的偏移量, Y轴方向
mScrollX 与 mScrollY 代表我们当前偏移的位置
oldX与oldY代表之前的偏移位置

方法:

scrollBy():移动组件滑动位置,会导致onScrollChanged()方法被调用,和视图会被抛弃。在当前视图内容继续偏移(x , y)个单位,显示(可视)区域也跟着偏移(x,y)个单位。
scrollTo():设置组件滑动位置,同上。在当前视图内容偏移至(x , y)座标处,即显示(可视)区域位于(x , y)座标处。
调用View的scrollTo()和scrollBy()是用于滑动View中的内容,而不是把某个View的位置进行改变。

例子:

/*这个方法是发生在左右滑动组件,设置其左右边界,使之到达边界时不超过边界,边界值视具体情况而定*/
private void handleMove(MotionEvent ev){
        final int historySize = ev.getHistorySize();
        final int pointerCount = ev.getPointerCount();

        float tx = 0,ty = 0;
        for(int h=0;h<historySize;h++){
            for(int p=0;p<pointerCount;p++){
                tx = ev.getHistoricalX(p, h);
                ty = ev.getHistoricalY(p, h);
                /*使用getScrollX获得当前滚动组件左边的座标,小于0则超出了左边界,大于?值则超出了右边界/
                if(this.getScrollX() < 0) {
                    scrollTo(0, 0);
                    continue;
                }else if(this.getScrollX() > this.getWidth()/3*2) {
                    scrollTo(this.getWidth()/3*2,0);
                    continue;
                }

                this.scrollBy((int) (x-tx),0);
                x = tx;
                y = ty;
            }
        }

        for(int p = 0;p<pointerCount;p++){
            tx = ev.getX(p);
            ty = ev.getY(p);

            if(this.getScrollX() < 0) {
                scrollTo(0,0);
                continue;
            } else if(this.getScrollX() > this.getWidth()) {
                scrollTo(this.getWidth(),0);
                continue;
            }

            this.scrollBy((int)(x-tx),0);
            x = tx;
            y = ty;

        }
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章