zoukankan      html  css  js  c++  java
  • Android仿IOS回弹效果 ScrollView回弹 总结

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

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

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

    以下的代码是我对大家公布的做了点小改动   认为没太大问题


    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


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

    祝大家每天都能写出好代码...


  • 相关阅读:
    基于Dapper的开源Lambda扩展,且支持分库分表自动生成实体基础
    用SignalR和Layui搭建自己的web聊天网站
    MySQL查看、修改字符集及Collation
    ASP.NET MVC中有四种过滤器类型
    一个简单的大转盘抽奖程序(附.NetCore Demo源码)
    网站统计中的访问信息收集的前端实现
    微信小程序实现按首字母检索城市列表
    微信小程序异步处理
    微信小程序下拉框
    node.js上传文件
  • 原文地址:https://www.cnblogs.com/bhlsheji/p/5322412.html
Copyright © 2011-2022 走看看