View滑动学习笔记
来源:互联网 发布:社会工程学数据库 编辑:程序博客网 时间:2024/06/16 19:08
1).实现滑动的方式:
- 通过动画给View增加平移滑动的效果
- 通过改变View的LayoutParams使得View重新布局
- 通过View自身提供的ScrollTo/scrollBy方法实现滑动
- 通过layout
1.通过动画
这里以属性动画为例:
ObjectAnimator.ofFloat(targetView,"translationX",0,100).setDuration(1000).start();
2.通过改变View的LayoutParams
示例:
RelativeLayout.LayoutParams layoutParams (RelativeLayout.LayoutParams) targetView.getLayoutParams(); layoutParams.leftMargin +=100; targetView.setLayoutParams(layoutParams);
3.通过ScrollTo/scrollBy
/** mScrollX和mScrollY表示:View的内容(content)相对于View本身在水平或垂直方向的偏移量. **/public final int getScrollX() { return mScrollX;}public final int getScrollY() { return mScrollY;}/** * Set the scrolled position of your view. This will * cause a call to {@link #onScrollChanged(int, int, * int,int)}and the view will be invalidated. * @param x the x position to scroll to * @param y the y position to scroll to */public void scrollTo(int x, int y) { if (mScrollX != x || mScrollY != y) { int oldX = mScrollX; int oldY = mScrollY; mScrollX = x; mScrollY = y; invalidateParentCaches(); onScrollChanged(mScrollX, mScrollY, oldX, oldY); if (!awakenScrollBars()) { postInvalidateOnAnimation(); } }}public void scrollBy(int x, int y) { scrollTo(mScrollX + x, mScrollY + y); }}
- 用法
targetView.scrollTo(100,0),targetView的内容向左滑动到(-100,0)。 targetView.scrollTo(-100,0),targetView的内容向右滑动到(100,0)。 targetView.scrollBy(100,0),targetView的内容相对于上个位置向左滑动100像素。 targetView.scrollBy(-100,0),targetView的内容相对于上个位置向右滑动100像素。
- 滑动的是ViewGroup/View的内容,不是ViewGroup/View本身。
- 滑动是一瞬间的。
- scrollBy()底层是由scrollTo()实现的
- scrollTo()时为何参数值和坐标反向?
由scrollTo(int x, int y)的注释可知调用该方法会回调onScrollChanged()方法,并且会重新绘制view,draw()过程中最终会调用invalidate()方法。
public void invalidate(int l, int t, int r, int b) { final int scrollX = mScrollX; final int scrollY = mScrollY; //scrollTo时为何参数和坐标反向的真实原因 invalidateInternal(l - scrollX, t - scrollY, r - scrollX, b - scrollY, true, false);
特别注意:如果你给一个ViewGroup调用scrollTo()方法滚动的是ViewGroup里面的内容,如果想滚动一个ViewGroup则再给他嵌套一个外层,滚动外层即可。
2).弹性滑动实现方式:
1. Scroller
使用示例:
Scroller mScroller= new Scroller(mContext);/** * 缓慢滚动到指定位置 * @param destX 指定滚动到的X轴位置 * @param destY 指定滚动到的Y轴位置 */ private void smoothScrollTo(int destX, int destY) { //获取当前滚动的距离 int scrollX = getScrollX(); //获取需要滚动的偏移量 int delta = destX - scrollX; //设置1000ms内滚动到delta位置,而效果就是慢慢滑动 mScroller.startScroll(scrollX, 0, delta, 0, 1000); invalidate(); } /** * 持续滚动,实现慢慢滑动 */ @Override public void computeScroll() { if (mScroller.computeScrollOffset()){ scrollTo(mScroller.getCurrX(),mScroller.getCurrY()); postInvalidate(); } }
2. ObjectAnimator.ofFloat(targetView,"translationX",0,100).setDuration(100).start();
3.值动画+layoutParams或值动画+scrollTo/scrollBy
ValueAnimator animator = ValueAnimator.ofFloat(0, 100 ); animator.setTarget(targetView); animator.setDuration(1000).start(); animator.addUpdateListener(new AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { float value=(Float) animation.getAnimatedValue(); targetView.ScrollTo(value,0); }
4.handler +scrollTo/scrollBy
private static final int MESSAGE_SCROLL_TO = 1; private static final int FRAME_COUNT = 30; private static final int DELATED_TIME = 33; private int mCount = 0; @suppressLint("HandlerLeak") private Handler handler = new handler(){ public void handleMessage(Message msg){ switch(msg.what){ case MESSAGE_SCROLL_TO: mCount ++ ; if (mCount <= FRAME_COUNT){ float fraction = mCount / (float) FRAME_COUNT; int scrollX = (int) (fraction * 100); mButton1.scrollTo(scrollX,0); mHandelr.sendEmptyMessageDelayed(MESSAGE_SCROLL_TO , DELAYED_TIME); } break; default : break; } } }
阅读全文
0 0
- View滑动---学习笔记
- View滑动学习笔记
- View--学习笔记(二)--View滑动
- Android学习笔记 3.2View的滑动
- Android View学习笔记(二):View滑动方式总结
- 学习笔记:View的事件体系2:View的滑动
- Android学习笔记 3.3View的弹性滑动
- 学习笔记:View的事件体系3:弹性滑动
- View学习笔记(2)-View的坐标系以及View的滑动1
- Android学习笔记-使用layout方法使View随手指的滑动而滑动
- 关于view滑动的学习
- Androin学习笔记五十三: Android中实现view可以滑动的六种方法
- View学习笔记----View坐标
- View事件体系学习(一)滑动
- sql2005学习笔记-VIEW
- View 学习笔记
- view测量学习笔记
- View源码学习笔记
- 使用idea启动项目时,报错:Error:java: Compilation failed: internal java compiler error
- 自主学习(active learning)
- vue 开发中element-ui库的switch开关绑定number类型数据不成功问题
- 初学者-使用java开发loadrunner脚本-测试Oracle
- C#去除HTML标签
- View滑动学习笔记
- Kylin实践之使用Hive视图
- 欢迎使用CSDN-markdown编辑器
- uplodify崩溃
- Java在游戏服务器开发中的应用
- 面向对象 构造方法 初始化对象
- 西瓜书《机器学习》课后答案——chapter5_5.10
- mybatis和spring整合的几种方式及使用注解简化sql(不使用xml方式写sql)
- Java单例的由浅入深----懒汉式的升级(2 原子操作、指令重排)懒汉式的最终版本(volatile)