您的位置:首页 > 移动开发 > Android开发

Android仿IOS回弹效果 ScrollView回弹 总结

2016-12-06 10:52 676 查看
转载地址:http://blog.csdn.net/aaawqqq/article/details/37740463

Android仿IOS回弹效果  ScrollView回弹 总结

应项目中的需求  需要仿IOS 下拉回弹的效果 , 我在网上搜了很多 大多数都是拿scrollview 改吧改吧

试了一些  发现总有点小问题

下面的代码是我对大家发布的做了点小修改   觉得没太大问题

[java]
view plain
copy

package com.example.myscrollview;  
  
import android.content.Context;  
import android.graphics.Rect;  
import android.util.AttributeSet;  
import android.view.MotionEvent;  
import android.view.View;  
import android.view.animation.TranslateAnimation;  
import android.widget.ScrollView;  
  
/** 
 * Bolg :http://blog.csdn.net/aaawqqq?viewmode=contents 
 *  
 * @author baozi 
 *  
 */  
  
public class MyScrollView extends ScrollView {  
  
    // 拖动的距离 size = 4 的意思 只允许拖动屏幕的1/4  
    private static final int size = 4;  
    private View inner;  
    private float y;  
    private Rect normal = new Rect();;  
  
    public MyScrollView(Context context) {  
        super(context);  
    }  
  
    public MyScrollView(Context context, AttributeSet attrs) {  
        super(context, attrs);  
    }  
  
    @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()) {  
                // Log.v("mlguitar", "will up and animation");  
                animation();  
            }  
            break;  
        case MotionEvent.ACTION_MOVE:  
            final float preY = y;  
            float nowY = ev.getY();  
            /** 
             * size=4 表示 拖动的距离为屏幕的高度的1/4 
             */  
            int deltaY = (int) (preY - nowY) / size;  
            // 滚动  
            // scrollBy(0, deltaY);  
  
            y = nowY;  
            // 当滚动到最上或者最下时就不会再滚动,这时移动布局  
            if (isNeedMove()) {  
                if (normal.isEmpty()) {  
                    // 保存正常的布局位置  
                    normal.set(inner.getLeft(), inner.getTop(),  
                            inner.getRight(), inner.getBottom());  
                    return;  
                }  
                int yy = inner.getTop() - deltaY;  
  
                // 移动布局  
                inner.layout(inner.getLeft(), yy, inner.getRight(),  
                        inner.getBottom() - deltaY);  
            }  
            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;  
    }  
  
}  
// ┏┓   ┏┓  
// ┏┛┻━━━┛┻┓  
// ┃       ┃    
// ┃   ━   ┃  
// ┃ ┳┛ ┗┳ ┃  
// ┃       ┃  
// ┃   ┻   ┃  
// ┃       ┃  
// ┗━┓   ┏━┛  
// ┃   ┃ 神兽保佑          
// ┃   ┃ 代码无BUG!  
// ┃   ┗━━━┓  
// ┃       ┣┓  
// ┃       ┏┛  
// ┗┓┓┏━┳┓┏┛  
// ┃┫┫ ┃┫┫  
// ┗┻┛ ┗┻┛  

代码里面size 这个参数是用来设置拖动的距离    
size= 4 代表  view只会跟随手指滑动1/4的距离

size=3  代表  跟随手指滑动1/3的距离

其它同理

Demo 下载地址:   http://download.csdn.net/detail/aaawqqq/7629533

如果有更好的效果请教我一下 谢谢

祝大家每天都能写出好代码...
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: