android自定义弹性ScrollVIew ,十分简单!
2016-12-19 20:01
411 查看
太简单,不多废话,直接上代码:
不上图了,源码下载:
点击打开链接下载源码
package demo.com.customviewdemo.customview; import android.content.Context; import android.graphics.Rect; import android.util.AttributeSet; import android.util.Log; import android.view.MotionEvent; import android.view.View; import android.view.animation.BounceInterpolator; import android.view.animation.TranslateAnimation; import android.widget.ScrollView; /** * Created by Alv_chi */ public class RebounceScrollViewCopy extends ScrollView { private static final String TAG = "test"; private View contentView; private float downY; private float moveY; private Rect rect; private boolean isMoved; public RebounceScrollViewCopy(Context context) { this(context, null); } public RebounceScrollViewCopy(Context context, AttributeSet attrs) { this(context, attrs, 0); } public RebounceScrollViewCopy(Context context, AttributeSet attrs, int defStyleAttr) { this(context, attrs, defStyleAttr, 0); } public RebounceScrollViewCopy(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { super(context, attrs, defStyleAttr, defStyleRes); } @Override protected void onFinishInflate() { /** * onFinishInflate 当View中所有的子控件均被映射成xml后触发 * F inalize inflating a view from XML. This is called as the last phase * of inflation, after all child views have been added */ super.onFinishInflate(); if (getChildCount() > 0) { contentView = getChildAt(0); } } @Override protected void onLayout(boolean changed, int l, int t, int r, int b) { super.onLayout(changed, l, t, r, b); if (contentView == null) return; // 用一矩形,记录contentView的原始位置: rect = new Rect(contentView.getLeft(), contentView.getTop(), contentView.getRight(), contentView.getBottom()); } @Override public boolean dispatchTouchEvent(MotionEvent ev) { switch (ev.getAction()) { case MotionEvent.ACTION_DOWN: downY = ev.getY(); break; case MotionEvent.ACTION_MOVE: if (contentView != null) { moveY = ev.getY(); float deltaY = moveY - downY; Log.e(TAG, "dispatchTouchEvent: deltaY="+deltaY ); int offset = (int) (deltaY * 0.7); int scrollY = getScrollY(); if (scrollY == 0 && deltaY > 0) {//计算是否到ScrollView的顶部,以及判断是否向下拉; // 移动ContentView,并标记移动了 contentView.layout(rect.left, rect.top + offset, rect.right, rect.bottom + offset); isMoved = true; } else if (scrollY + getHeight() == contentView.getHeight() && deltaY < 0) {//计算是否到ScrollVIew底部,以及判断是否向上拉; // 移动ContentView,并标记移动了 contentView.layout(rect.left, rect.top + offset, rect.right, rect.bottom + offset); isMoved = true; } } break; case MotionEvent.ACTION_UP: if (isMoved) { // 定义动画 TranslateAnimation translateAnimation = new TranslateAnimation(0, 0, contentView.getTop(), rect.top); translateAnimation.setDuration(800); translateAnimation.setInterpolator(new BounceInterpolator()); translateAnimation.start(); contentView.setAnimation(translateAnimation); // contentView回复原位置; contentView.layout(rect.left, rect.top, rect.right, rect.bottom); isMoved = false; } break; } return super.dispatchTouchEvent(ev); } }
不上图了,源码下载:
点击打开链接下载源码
相关文章推荐
- Android自定义弹性ScrollView(有误请略过此文章)
- Android自定义view-弹性ScrollView(下)
- Android 弹性ListView和ScrollView 简单优雅地实现回弹效果
- Android自定义view-弹性ScrollView(上)
- Android 自定义最简单的ScrollView,附带拉动回弹
- android 有弹性的ScrollView 简单实现,与处理ScrollView和ListView,GridView之间的冲突
- android scrollview 简单的使用
- 基于百度地图 Android SDKv1.3.5实现简单的定位功能,自定义标题栏
- Android 弹性ScrollView
- Android自定义简单的View
- android scrollview 简单的使用
- android 自定义ScrollView实现反弹效果(以及解决和ListView之间的冲突)
- Android布局中ScrollView与ListView的冲突的最简单方法(listItem.measure(0, 0))
- Android 如何自定义一个简单的组件和自定义的点击事件(中级)
- android scrollview 简单的使用
- android scrollview 简单的使用
- 基于百度地图 Android SDKv1.3.5实现简单的定位功能,自定义标题栏
- android简单自定义view
- Android布局中ScrollView与ListView的冲突的最简单方法
- android最简单的自定义全屏Dialog