采用Scroller实现任意布局的上下左右弹性效果
16lz
2021-01-25
不知道Scroller是什么的同志先看下面:
Android Scroller类的详细分析
这里采用Scroller实现类似iphone的上下拖拉弹性效果,具体代码如下:
以上代码只需要稍加改动就可以上下左右4个方向上的弹性效果了
看下面代码,只在BouncyGestureListener的onScroll方法中加了X方向的位移。
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()会被调用,否则不一定会刷新界面,看不到滚动效果}@Overridepublic void computeScroll() {//判断mScroller滚动是否完成if (mScroller.computeScrollOffset()) {//这里调用View的scrollTo()完成实际的滚动scrollTo(mScroller.getCurrX(), mScroller.getCurrY());//必须调用该方法,否则不一定能看到滚动效果postInvalidate();}super.computeScroll();}@Overridepublic 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 {@Overridepublic boolean onDown(MotionEvent e) {// TODO Auto-generated method stubreturn true;}@Overridepublic void onShowPress(MotionEvent e) {// TODO Auto-generated method stub}@Overridepublic boolean onSingleTapUp(MotionEvent e) {// TODO Auto-generated method stubreturn false;}@Overridepublic boolean onScroll(MotionEvent e1, MotionEvent e2,float distanceX, float distanceY) {int dis = (int)((distanceY-0.5)/2);smoothScrollBy(0, dis);return false;}@Overridepublic void onLongPress(MotionEvent e) {// TODO Auto-generated method stub}@Overridepublic boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,float velocityY) {// TODO Auto-generated method stubreturn 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()会被调用,否则不一定会刷新界面,看不到滚动效果}@Overridepublic void computeScroll() {//判断mScroller滚动是否完成if (mScroller.computeScrollOffset()) {//这里调用View的scrollTo()完成实际的滚动scrollTo(mScroller.getCurrX(), mScroller.getCurrY());//必须调用该方法,否则不一定能看到滚动效果postInvalidate();}super.computeScroll();}@Overridepublic 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 {@Overridepublic boolean onDown(MotionEvent e) {// TODO Auto-generated method stubreturn true;}@Overridepublic void onShowPress(MotionEvent e) {// TODO Auto-generated method stub}@Overridepublic boolean onSingleTapUp(MotionEvent e) {// TODO Auto-generated method stubreturn false;}@Overridepublic 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;}@Overridepublic void onLongPress(MotionEvent e) {// TODO Auto-generated method stub}@Overridepublic boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,float velocityY) {// TODO Auto-generated method stubreturn false;}}}
更多相关文章
- 没有一行代码,「2020 新冠肺炎记忆」这个项目却登上了 GitHub 中
- Ubuntu 将adb加入环境变量 及adb shell 无法启动
- 【Android(安卓)开发教程】Spinner
- Android(安卓)数据库初窥
- android 发送短信和打电话的方法
- Android使用Handler实现打地鼠游戏
- Android(安卓)逐帧动画isRunning 一直返回true的问题
- Android(安卓)网络显示图片 通过代理访问
- android 中对apache httpclient及httpurlconnection的选择