采用Scroller实现任意布局的上下左右弹性效果
2017-04-10 18:52
459 查看
不知道Scroller是什么的同志先看下面:
Android Scroller类的详细分析
这里采用Scroller实现类似iphone的上下拖拉弹性效果,具体代码如下:
以上代码只需要稍加改动就可以上下左右4个方向上的弹性效果了
看下面代码,只在BouncyGestureListener的onScroll方法中加了X方向的位移。
一个iOS风格的边缘弹性效果,支持几乎所有滚动视图
http://www.jcodecraeer.com/a/opensource/2015/1205/3753.html
Android Scroller类的详细分析
这里采用Scroller实现类似iphone的上下拖拉弹性效果,具体代码如下:
import android.content.Context; import android.util.AttributeSet; import android.view.GestureDetector; import android.view.MotionEvent; import android.widget.LinearLayout; import android.widget.Scroller; public class BouncyLinearLayout extends LinearLayout { private static final String TAG = "BouncyLinearLayout"; private Scroller mScroller; private GestureDetector mGestureDetector; public BouncyLinearLayout(Context context) { this(context, null); } public BouncyLinearLayout(Context context, AttributeSet attrs) { super(context, attrs); setClickable(true); setLongClickable(true); mScroller = new Scroller(context); mGestureDetector = new GestureDetector(context, new BouncyGestureListener()); } /** * 滚动到目标位置 * @param fx * @param fy */ protected void smoothScrollTo(int fx, int fy) { int dx = fx - mScroller.getFinalX(); int dy = fy - mScroller.getFinalY(); smoothScrollBy(dx, dy); } /** * 设置滚动的相对偏移 * @param dx * @param dy */ protected void smoothScrollBy(int dx, int dy) { //设置mScroller的滚动偏移量 mScroller.startScroll(mScroller.getFinalX(), mScroller.getFinalY(), dx, dy); invalidate();//这里必须调用invalidate()才能保证computeScroll()会被调用,否则不一定会刷新界面,看不到滚动效果 } @Override public void computeScroll() { //判断mScroller滚动是否完成 if (mScroller.computeScrollOffset()) { //这里调用View的scrollTo()完成实际的滚动 scrollTo(mScroller.getCurrX(), mScroller.getCurrY()); //必须调用该方法,否则不一定能看到滚动效果 postInvalidate(); } super.computeScroll(); } @Override public boolean onTouchEvent(MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_UP : smoothScrollTo(0, 0); break; default: return mGestureDetector.onTouchEvent(event); } return super.onTouchEvent(event); } class BouncyGestureListener implements GestureDetector.OnGestureListener { @Override public boolean onDown(MotionEvent e) { // TODO Auto-generated method stub return true; } @Override public void onShowPress(MotionEvent e) { // TODO Auto-generated method stub } @Override public boolean onSingleTapUp(MotionEvent e) { // TODO Auto-generated method stub return false; } @Override public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { int dis = (int)((distanceY-0.5)/2); smoothScrollBy(0, dis); return false; } @Override public void onLongPress(MotionEvent e) { // TODO Auto-generated method stub } @Override public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { // TODO Auto-generated method stub return false; } } }
以上代码只需要稍加改动就可以上下左右4个方向上的弹性效果了
看下面代码,只在BouncyGestureListener的onScroll方法中加了X方向的位移。
import android.content.Context; import android.util.AttributeSet; import android.view.GestureDetector; import android.view.MotionEvent; import android.widget.LinearLayout; import android.widget.Scroller; public class BouncyLinearLayout extends LinearLayout { private static final String TAG = "BouncyLinearLayout"; private Scroller mScroller; private GestureDetector mGestureDetector; public BouncyLinearLayout(Context context) { this(context, null); } public BouncyLinearLayout(Context context, AttributeSet attrs) { super(context, attrs); setClickable(true); setLongClickable(true); mScroller = new Scroller(context); mGestureDetector = new GestureDetector(context, new BouncyGestureListener()); } /** * 滚动到目标位置 * @param fx * @param fy */ protected void smoothScrollTo(int fx, int fy) { int dx = fx - mScroller.getFinalX(); int dy = fy - mScroller.getFinalY(); smoothScrollBy(dx, dy); } /** * 设置滚动的相对偏移 * @param dx * @param dy */ protected void smoothScrollBy(int dx, int dy) { //设置mScroller的滚动偏移量 mScroller.startScroll(mScroller.getFinalX(), mScroller.getFinalY(), dx, dy); invalidate();//这里必须调用invalidate()才能保证computeScroll()会被调用,否则不一定会刷新界面,看不到滚动效果 } @Override public void computeScroll() { //判断mScroller滚动是否完成 if (mScroller.computeScrollOffset()) { //这里调用View的scrollTo()完成实际的滚动 scrollTo(mScroller.getCurrX(), mScroller.getCurrY()); //必须调用该方法,否则不一定能看到滚动效果 postInvalidate(); } super.computeScroll(); } @Override public boolean onTouchEvent(MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_UP : smoothScrollTo(0, 0); break; default: return mGestureDetector.onTouchEvent(event); } return super.onTouchEvent(event); } class BouncyGestureListener implements GestureDetector.OnGestureListener { @Override public boolean onDown(MotionEvent e) { // TODO Auto-generated method stub return true; } @Override public void onShowPress(MotionEvent e) { // TODO Auto-generated method stub } @Override public boolean onSingleTapUp(MotionEvent e) { // TODO Auto-generated method stub return false; } @Override public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { int disX = (int)((distanceX-0.5)/2); int disY = (int)((distanceY-0.5)/2); smoothScrollBy(disX, disY); return false; } @Override public void onLongPress(MotionEvent e) { // TODO Auto-generated method stub } @Override public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { // TODO Auto-generated method stub return false; } } }
一个iOS风格的边缘弹性效果,支持几乎所有滚动视图
http://www.jcodecraeer.com/a/opensource/2015/1205/3753.html
相关文章推荐
- 采用Scroller实现任意布局的上下左右弹性效果
- 布局动画Android ScrollView HorizontalScrollView 实现全方向(上下左右)反弹效果
- 自定义布局实现左右或者上下翻页效果(借助Scroller类)
- 使用viewpager嵌套实现上下左右滑动切换图片(IOS双向滚动翻页效果相同)
- 实现点上下左右按钮,小图切换,点小图显示大图的效果
- Android 使用Scroller实现绚丽的ListView左右滑动删除Item效果
- 一个支持任意尺寸的图片上下左右滑动效果
- Android 使用Scroller实现绚丽的ListView左右滑动删除Item效果
- Js实现图片缩放上下左右移动效果
- Android 使用Scroller实现绚丽的ListView左右滑动删除Item效果
- 一种支持任意尺寸的图片滑动(上下左右滑动)效果
- 使用viewpager嵌套实现上下左右滑动切换图片(IOS双向滚动翻页效果相同)
- 一个支持任意尺寸的图片上下左右滑动效果
- 为ScrolloView加手势实现上下左右移动效果
- 三种布局实现上下回弹效果(普通布局,ListView,ScrollView)
- 用javascript实现以个动画效果(可以上下左右的移动)
- android 实现左右上下震动的效果
- jquery实现图片上下左右翻滚效果代码
- query实现图片上下左右翻滚效果代码
- Android 使用Scroller实现绚丽的ListView左右滑动删除Item效果