采用Scroller实现任意布局的上下左右弹性效果
来源:互联网 发布:php编程思想 编辑:程序博客网 时间:2024/05/22 10:31
不知道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()会被调用,否则不一定会刷新界面,看不到滚动效果}@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;}}}
一个iOS风格的边缘弹性效果,支持几乎所有滚动视图
http://www.jcodecraeer.com/a/opensource/2015/1205/3753.html
0 0
- 采用Scroller实现任意布局的上下左右弹性效果
- 采用Scroller实现任意布局的上下左右弹性效果
- 使用Scroller实现View的弹性滑动
- Scroller实现弹性滑动
- 使用Scroller实现弹性滑动
- Scroller实现View弹性滑动
- css实现内容上下左右居中的效果
- 利用Scroller实现自己的滑动布局
- Scroller 实现控件缓慢平移的效果
- 采用手势的上下左右来实现图像的处理
- 基于flex弹性布局头尾固定,中间滚动效果实现
- 任意上下左右的圆角
- Android 实现ListView的弹性效果
- Android中实现ListView的弹性效果
- 贝塞尔曲线的艺术---弹性效果实现
- Android 实现ListView的弹性效果
- Android View 的弹性滑动: Scroller使用说明
- Android中Scroller实现弹性滑动的原理和实例应用
- MySQL
- 顶部横向滑动菜单效果
- iOS证书和描述文件申请
- ListView,GridView之LayoutAnimation特殊动画的实现
- 1008 Elevator
- 采用Scroller实现任意布局的上下左右弹性效果
- 华为手机在开发Android调试时logcat不显示输出信息的解决办法
- 异常
- hdu4815(01背包)
- 刮刮卡效果
- 根据地址查询经纬度
- Android下集成FacebookSDk到项目并发表评论
- Android 单选队列 RadioGroup与RadioButton详解
- 在ListView上滑动显示Delete按钮