Android(安卓)Scroll
16lz
2021-01-24
实现滑动的七种方法:
一.layout方法
二.offsetLeftAndRight()与offsetTopAndBottom()
三.LayoutParams
四.scrollTo与scrollBy smoothScrollTo与smoothScrooBy
1.scrollTo . scrollBy方法移动的是view的content,即让View的内容移动.如果在ViewGroup中使用scrollTo.scrollBy方法,那么移动的将是所有子View,但如果在View中使用,那么移动的将是View的内容.
2.如果将scrollBy中的参数dx和dy设置为正数,那么content将向坐标轴负方向移动,如果将scrollBy中的参数dx , dy设置为负数,那么content将向坐标轴正方向移动.
五.Scroller,注意事项:同“四”
六.属性动画
七.ViewDragHelper
Scroller简单使用
- 基本api
mScroller.getCurrX() //获取mScroller当前水平滚动的位置 mScroller.getCurrY() //获取mScroller当前竖直滚动的位置 mScroller.getFinalX() //获取mScroller最终停止的水平位置mScroller.getFinalY() //获取mScroller最终停止的竖直位置 mScroller.setFinalX(int newX) //设置mScroller最终停留的水平位置,没有动画效果,直接跳到目标位置 mScroller.setFinalY(int newY) //设置mScroller最终停留的竖直位置,没有动画效果,直接跳到目标位置 //滚动,startX, startY为开始滚动的位置,dx,dy为滚动的偏移量, duration为完成滚动的时间 mScroller.startScroll(int startX, int startY, int dx, int dy) //使用默认完成时间250ms mScroller.startScroll(int startX, int startY, int dx, int dy, int duration) mScroller.computeScrollOffset() //返回值为boolean,true说明滚动尚未完成,false说明滚动已经完成。这是一个很重要的方法,通常放在View.computeScroll()中,用来判断是否滚动是否结束。
- 基本使用
public class ScrollerLayout extends RelativeLayout { private Scroller scroller; public ScrollerLayout(Context context, AttributeSet attrs) { super(context, attrs); scroller = new Scroller(context); } //滑动时调用 public void startScroll(int dx, int dy) { scroller.startScroll(scroller.getFinalX(), scroller.getFinalY(), dx, dy); //调用invalidate(),间接调用computeScroll() invalidate(); } @Override public void computeScroll() { super.computeScroll(); //判断滚动是否完成 if (scroller.computeScrollOffset()) { //完成实际滚动 scrollTo(scroller.getCurrX(), scroller.getCurrY()); //刷新,重复调用computeScroll() invalidate(); } }}
Scroller实际应用
实际用法有好多,其中可以用来实现阻尼效果
不叨叨,上代码
public class ScrollerLayout2 extends LinearLayout{ private Scroller scroller; //手势的事件更丰富一点 private GestureDetector gestureDetector; public ScrollerLayout2(Context context, AttributeSet attrs) { super(context, attrs); scroller = new Scroller(context); gestureDetector = new GestureDetector(context , new GestureCallback()); } @Override public boolean onTouchEvent(MotionEvent event) { switch (event.getAction()){ case MotionEvent.ACTION_UP: //手指抬起,回到原处 startScroll(0 , -scroller.getFinalY()); break; default: return gestureDetector.onTouchEvent(event); } return super.onTouchEvent(event); } /** * 开始滑动 * @param dx 正值向左移动 * @param dy 正值向左移动 */ private void startScroll(int dx , int dy){ scroller.startScroll(scroller.getFinalX() , scroller.getFinalY() , dx , dy); invalidate(); } @Override public void computeScroll() { super.computeScroll(); if (scroller.computeScrollOffset()){ scrollTo(scroller.getCurrX() , scroller.getCurrY()); invalidate(); } } private class GestureCallback implements GestureDetector.OnGestureListener{ @Override public boolean onDown(MotionEvent e) { //这里要返回true哦,要不后面的move和up不会到这个view里面来了 return true; } @Override public void onShowPress(MotionEvent e) { } @Override public boolean onSingleTapUp(MotionEvent e) { return false; } @Override public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { startScroll(0 , (int) distanceY/2); return false; } @Override public void onLongPress(MotionEvent e) { } @Override public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { return false; } } @Override public boolean onInterceptTouchEvent(MotionEvent ev) { return true; }}
源码
参考01
参考02
更多相关文章
- Android(安卓)菜单(OptionMenu)大全
- Android(安卓)Camera Framework层分析
- Android(安卓)中判断是否存在虚拟按键
- Android(安卓)Laucher3 去掉二级菜单
- Android(安卓)插件化分析(2)- 动态代理
- WebView深究之Android是如何实现webview初始化的
- Android(安卓)webview加载富文本 屏幕简单适配
- Android中获取地理位置经纬度
- android中setVisibility的用法