zoukankan      html  css  js  c++  java
  • Android进阶篇自定义ScrollView反弹效果

    public class autoScrollView extends ScrollView {  
        private View inner;  
        private float y;  
        private Rect normal = new Rect();  
          
        public autoScrollView(Context context) {
            super(context);
            // TODO Auto-generated constructor stub
        }
    
        public autoScrollView(Context context, AttributeSet attrs) {  
            super(context, attrs);  
        }  
        
        public autoScrollView(Context context, AttributeSet attrs, int defStyle) {
            super(context, attrs, defStyle);
            // TODO Auto-generated constructor stub
        }
    
        
        @Override  
        protected void onFinishInflate() {  
            if (getChildCount() > 0) {  
                inner = getChildAt(0);  
            }  
        }  
        
        @Override  
        public boolean onTouchEvent(MotionEvent ev) {  
            if (inner == null) {  
                return super.onTouchEvent(ev);  
            } else {  
                commOnTouchEvent(ev);  
            }  
      
            return super.onTouchEvent(ev);  
        }  
      
        public void commOnTouchEvent(MotionEvent ev) {  
            int action = ev.getAction();  
            switch (action) {  
            case MotionEvent.ACTION_DOWN:  
                y = ev.getY();  
                break;  
            case MotionEvent.ACTION_UP:  
                if (isNeedAnimation()) {  
                    animation();  
                }  
                break;  
            case MotionEvent.ACTION_MOVE:  
                final float preX = y;  
                float nowY = ev.getY();  
                int deltaY = (int) (preX - nowY);  
                // 滚动   
                scrollBy(0, deltaY); 
      
                y = nowY;  
                // 当滚动到最左或者最右时就不会再滚动,这时移动布局   
                if (isNeedMove()) {  
                    if (normal.isEmpty()) {  
                        // 保存正常的布局位置   
                        normal.set(inner.getLeft(), inner.getTop(), inner.getRight(), inner.getBottom());  
                    }  
                    // 移动布局   
                    inner.layout(inner.getLeft(), inner.getTop()-deltaY/2, inner.getRight(), inner.getBottom()-deltaY/2);
                }  
                break;  
      
            default:  
                break;  
            }  
        }  
      
        // 开启动画移动   
        public void animation() {  
            // 开启移动动画   
            TranslateAnimation ta = new TranslateAnimation(0, 0, inner.getTop(), normal.top);  
            ta.setDuration(200);  
            inner.startAnimation(ta);  
            // 设置回到正常的布局位置   
            inner.layout(normal.left, normal.top, normal.right, normal.bottom);  
            normal.setEmpty();  
        }  
        
        // 是否需要开启动画   
        public boolean isNeedAnimation() {  
            return !normal.isEmpty();  
        }  
        
        // 是否需要移动布局   
        public boolean isNeedMove() {  
            int offset = inner.getMeasuredHeight() - getHeight();  
            int scrollY = getScrollY();  
            if (scrollY == 0 || scrollY == offset) {  
                return true;  
            }  
            return false;  
        }  
    }  
  • 相关阅读:
    修改系统策略 作为服务登录
    PlayStation Suite(PSS)快速预览
    Python异常处理
    误操作把/bin目录移动到其他目录下的恢复方法
    SQL Prompt 自动过期反复激活防失效注册后隔一段时间莫名无法使用的处理
    [转帖]SQL SERVER 2005 同步复制技术
    动网论坛修改笔记
    网线的做法
    风讯修改记录
    远程桌面中调出任务管理器
  • 原文地址:https://www.cnblogs.com/gongcb/p/2541808.html
Copyright © 2011-2022 走看看