package com.animator.view;import android.animation.Animator;import android.animation.AnimatorListenerAdapter;import android.animation.ObjectAnimator;import android.content.Context;import android.util.AttributeSet;import android.view.MotionEvent;import android.view.View;import android.view.animation.BounceInterpolator;import android.widget.ScrollView;/** * @desc 自定义scrollView(属性动画实现具有反弹效果的ScrollView) * @creator caozhiqing * @data 2016/2/19 */public class FlowScrollView extends ScrollView {    private View contentView;    private final float scalCount = 0.5f;//阻尼系数    private float downY;//点击时的y    private ObjectAnimator objectAnimator;//动画    private float distanceY;//移动距离    private boolean isMoveing = false;//动画是正在进行//    private int scrollHeight = 0;//当内容不足以全屏时,内容随手指可滑动距离    public FlowScrollView(Context context) {        super(context);    }    public FlowScrollView(Context context, AttributeSet attrs) {        super(context, attrs);    }    public FlowScrollView(Context context, AttributeSet attrs, int defStyleAttr) {        super(context, attrs, defStyleAttr);    }    public FlowScrollView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {        super(context, attrs, defStyleAttr, defStyleRes);    }    @Override    protected void onFinishInflate() {//视图加载完成        super.onFinishInflate();        if (getChildCount() > 0) {            contentView = getChildAt(0);//            scrollHeight = contentView.getHeight();        }    }    @Override    public boolean onInterceptTouchEvent(MotionEvent ev) {        return super.onInterceptTouchEvent(ev);    }    @Override    public boolean onTouchEvent(MotionEvent ev) {        if (isMoveing) {            return false;        }        switch (ev.getAction()) {            case MotionEvent.ACTION_DOWN:                downY = ev.getY();                break;            case MotionEvent.ACTION_MOVE:                float deltY = ev.getY() - downY;                if (Math.abs(deltY) > 10 &&(getScrollY() == 0 || (getScrollY()+getHeight())==contentView.getHeight())) {                    contentView.setY(contentView.getY() + deltY * scalCount);                    distanceY += deltY * scalCount;                }                downY = ev.getY();                break;            case MotionEvent.ACTION_UP:                if (Math.abs(distanceY) > 0) {                    objectAnimator = ObjectAnimator.ofFloat(contentView, "translationY", distanceY, -(float) contentView.getTop());                    objectAnimator.setInterpolator(new BounceInterpolator());                    objectAnimator.addListener(new AnimatorListenerAdapter() {                        @Override                        public void onAnimationStart(Animator animation) {                            super.onAnimationStart(animation);                            isMoveing = true;                        }                        @Override                        public void onAnimationEnd(Animator animation) {                            super.onAnimationEnd(animation);                            distanceY = 0;                            isMoveing = false;                        }                    });                    objectAnimator.setDuration(500);                    objectAnimator.start();                }                break;            default:                break;        }        return super.onTouchEvent(ev);    }    @Override    protected void onScrollChanged(int l, int t, int oldl, int oldt) {        super.onScrollChanged(l, t, oldl, oldt);    }}就向使用一般的Scrollview 使用此View即可。

更多相关文章

  1. 【Android】【绘图】绘制波浪线动画
  2. AndroidのTween动画实现
  3. Android Activity生命周期具体内容概述
  4. Android 补间动画(动画列表,平移,旋转,缩放,渐变,动画集合)
  5. android使用属性动画代替补间动画
  6. 详细的北京安卓培训班课程内容介绍
  7. Android 播放Gif 动画

随机推荐

  1. android小程序--猜猜红桃A在哪儿
  2. Android(安卓)Library 工程实现模块复用
  3. 【设计模式二之Builder模式】设计模式的B
  4. 实现ListView的条目下自动隐藏显示Button
  5. Android(安卓)mp3音乐播放器实例-----概
  6. 【理论】【转】App工程结构搭建:几种常见A
  7. Android高级工程师之性能篇(1)--内存泄露
  8. Android基础学习【历史流程重走】 ---- A
  9. 谷歌力推低价Android手机的野心
  10. Android中获取后台正在运行的应用列表(附