Scroller的使用;

Scroller一般主要用在自定义View 布局中;

public class MyView extends ViewGroup {

    private int mLastMotionX;
    private int mLastMotionY;
    private Scroller mScroller;
    
    private VelocityTracker mVelocity;
    
    public MyView(Context context,AttributeSet attri){
        this(context,attri,0);
    }
    
    public MyView(Context context,AttributeSet attri ,int defstyle){
        super(context,attri,defstyle);
        mScroller = new Scroller(context);
    }

    @Override
    protected void onLayout(boolean changed, int l, int t, int r, int b) {
        // TODO Auto-generated method stub
        int childCount= this.getChildCount();
        View childView;
        int leftBound = 0;
        for(int i=0; i< childCount; i++){
            childView = this.getChildAt(i);
            if(childView.getVisibility() != View.GONE){
                 
                final int width = childView.getMeasuredWidth();
                
                childView.layout(leftBound, 0, leftBound + width, childView.getMeasuredHeight());
                leftBound += width;
            }
        }
    
    }
    
    @Override
    protected void onMeasure(int widthMeasureSpec,int heightMeasureSpec){
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        
        int childCount= this.getChildCount();
        View childView;
        for(int i=0; i< childCount; i++){
            childView = this.getChildAt(i);
            
            childView.measure(widthMeasureSpec, heightMeasureSpec);
        }
    }
    
    @Override
    public boolean onTouchEvent(MotionEvent ev){
        
        
        
        if(null != mVelocity){
            mVelocity = VelocityTracker.obtain();
            mVelocity.addMovement(ev);
            mVelocity.computeCurrentVelocity(1000);
        }
        
        float  downX = ev.getX();
        float  downY = ev.getY();
        
        switch(ev.getAction()){
        case MotionEvent.ACTION_DOWN:
            if(!mScroller.isFinished()){
                mScroller.abortAnimation();
            }
            mLastMotionX = (int) downX;
            mLastMotionY = (int) downY;
            
            break;
        case MotionEvent.ACTION_MOVE:
            int deltaX = (int) (ev.getX() - mLastMotionX);
            mLastMotionX = (int) ev.getX();
            Log.i("luke", "deltaX="+deltaX);
            /* if(deltaX > 0){
                    smoothScrollBy(-deltaX,0);
            }else {
                smoothScrollBy(deltaX,0);
            } */
              scrollBy(deltaX,0);
            
            //smoothScrollTo(deltaX,0);
//              smoothScrollBy(deltaX,0);
            break;
        case MotionEvent.ACTION_UP:
            
            if(null != mVelocity){
                mVelocity.recycle();
                mVelocity = null;
            }
            
              int delta =  - getScrollX();
            mScroller.startScroll(getScrollX(), 0, delta, 0, 500);
            invalidate();
            break;
        
        }
        return true;
    }
    
    
    //调用此方法设置滚动的相对偏移
        public void smoothScrollBy(int dx, int dy) {

            //设置mScroller的滚动偏移量
            mScroller.startScroll(mScroller.getStartX(), 0 , dx, dy,Math.abs(dx)*3);
            postInvalidate();;//这里必须调用invalidate()才能保证computeScroll()会被调用,否则不一定会刷新界面,看不到滚动效果
        }
        
    
     private void  smoothScrollTo2(int detalX,int deltaY){
        mScroller.startScroll(mScroller.getCurrX(),0, detalX, 0, Math.abs(detalX)*3);
        postInvalidate();
        
    }
    
    //调用此方法滚动到目标位置
        public void smoothScrollTo(int fx, int fy) {
            int dx = fx - mScroller.getFinalX();
            int dy = fy - mScroller.getFinalY();
            smoothScrollBy(dx, dy);
        }
    
    @Override
    public void computeScroll() {
        if (mScroller.computeScrollOffset()) {
            scrollTo(mScroller.getCurrX(), mScroller.getCurrY());
            postInvalidate();
            
        }
    }

Vue-virtual-scroller是一个用于渲染大量数据的Vue组件。它通过只渲染可见的部分来提高性能,而不是将整个列表都渲染出来。 以下是使用Vue-virtual-scroller的步骤: 1. 安装Vue-virtual-scroller 你可以使用npm来安装Vue-virtual-scroller: ``` npm install vue-virtual-scroller ``` 2. 导入Vue-virtual-scroller 在需要使用Vue-virtual-scroller的组件中导入它: ``` import { VirtualScroller } from 'vue-virtual-scroller'; ``` 3. 注册组件 将VirtualScroller组件注册到你的Vue应用中: ``` export default { components: { VirtualScroller }, // ... } ``` 4. 使用组件 在模板中使用VirtualScroller组件来渲染你的数据: ``` <virtual-scroller :items="items"> <template slot-scope="{ item }"> <!-- 渲染你的数据 --> </template> </virtual-scroller> ``` 其中,items是你要渲染的数据数组,slot-scope用于传递数据到模板中。 5. 配置组件 你可以通过props来配置VirtualScroller组件: - itemsPerPage:每页显示的数据数量(默认为30) - buffer:缓存的数据数量(默认为0) - itemSize:每个数据项的高度(可以是固定的数字,也可以是一个返回高度的函数) - minIndex:最小的数据索引 - maxIndex:最大的数据索引 例如,你可以这样配置VirtualScroller: ``` <virtual-scroller :items="items" :items-per-page="50" :buffer="10" :item-size="50"> <template slot-scope="{ item }"> <!-- 渲染你的数据 --> </template> </virtual-scroller> ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值