android 自定义具有反弹效果的ScrollView
2016-02-23 10:52
387 查看
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) 4000 > 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即可。
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories