不知道Scroller是什么的同志先看下面:
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;}}}

更多相关文章

  1. 没有一行代码,「2020 新冠肺炎记忆」这个项目却登上了 GitHub 中
  2. Ubuntu 将adb加入环境变量 及adb shell 无法启动
  3. 【Android(安卓)开发教程】Spinner
  4. Android(安卓)数据库初窥
  5. android 发送短信和打电话的方法
  6. Android使用Handler实现打地鼠游戏
  7. Android(安卓)逐帧动画isRunning 一直返回true的问题
  8. Android(安卓)网络显示图片 通过代理访问
  9. android 中对apache httpclient及httpurlconnection的选择

随机推荐

  1. 输入法显示和隐藏
  2. android sdk manager 快速下载sdk
  3. 关于SearchView的一些小细节
  4. AndroidManifest.xml:117: error: ERROR
  5. Android自定义View—小巧清爽的多节点进
  6. Settings设置页面的Preference使用方法
  7. Android游戏应用内悬浮球(不需要申请权限)
  8. Android(安卓)Flexboxlayout使用详解
  9. MTK android CTS测试
  10. Android(安卓)Gradle文件下获取自定义pro