• 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;  
        }  
    }  
  • 相关阅读:
    Ubuntu Linux下的Wireshark使用drcom_2011.lua分析drcom协议
    Keil提示premature end of file错误 无法生成HEX文件
    Linux和win7(win10)双系统时间错误问题 时间相差8小时
    Wireshark使用drcom_2011.lua插件协助分析drcom协议
    Keil报错failed to execute 'd:KeilC51BINC51.EXE'
    第一篇博文
    LG 7078 贪吃蛇
    LG 1791 人员雇佣
    洛谷 2698 Flowerpot
    HDU 5965 扫雷
  • 原文地址:https://www.cnblogs.com/gongcb/p/2541808.html
Copyright © 2020-2023  润新知