Android开发——View滑动的三种实现方式
2016-09-11 20:49
429 查看
0. 前言
Android开发中,我们常常需要View滑动实现一些绚丽的效果来优化用户体验。一般View的滑动可以用三种方式实现。
转载请注明出处:http://blog.csdn.net/seu_calvin/article/details/52473373
1. ScrollTo/ScrollBy
View提供了ScrollTo/ScrollBy专门用于View滑动,从下面源码可以看出,后者是使用前者来实现的:
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);
}
这里需要注意的是,View的两个属性mScrollX、mScrollY,分别可通过getScrollX和getScrollX方法获得。
mScrollX总是等于View左边缘和View内容左边缘在x轴方向的距离,同理理解mScrollY。我们在一个按钮上写上字,点击按钮后执行button.scrollTo(0,0)的逻辑,会发现按钮上的字位置不变,打印getScrollX/Y均为0。这就是所谓的内容和View边缘重合,即一开始的情况,如果执行的是button.scrollTo(100,100),按钮位置肯定不变,即不影响点击事件,但是字跑到左上方去了,这个字的位置肯定是比原来字的位置向上向左都移动了100个像素,即View内容的左上角和View本身的左上角相比向上向左都偏移了100个像素。这时候打印getScrollX/Y均为100。这和我们平时知道的屏幕坐标系是相反的。
总结:(1)简单方便,不会影响元素单击事件。(2)scrollTo()和scrollBy()移动的只是View的内容,并不能移动View本身,背景当然也是不移动的。如果是移动ViewGroup,移动的是所有的子View。 2. 动画动画可以实现非常复杂的动画效果,当然也可以实现View滑动的效果,原理是改变translationX、translationY的值。使用属性动画实例如下,View动画的例子略://使用属性动画,将View在1秒内向右平移50个像素
ObjectAnimator.ofFloat(mView, "translationX", 0 , 50).setDuration(1000).start();
需要注意的是,View动画有一个显著的缺点,那就是只对View的影像做操作,不会真正改变View的位置参数,因此可能对滑动后的新位置Button的点击事件失去响应。在系统眼里,这个Button没有发生任何改变。但是Android3.0以后属性动画解决了这个问题,3.0以下的可以通过设置两个按钮,并在恰当的时刻通过view.setVisibility间接解决该问题。
在动画的进行过程中,我们还可以设置监听器监听动画完成每一帧时,动画完成的比例。这样我们就可以完成更多的业务逻辑。
animator.addUpdateListener(new AnimatorUpdateListener(){
//动画完成一帧即回调
@override
public void onAnimationUpdate(ValueAnimator animator){
//获取动画完成比例
float faction = animator.getAnimatedFraction();
//完成其他效果
}
});
3. 改变布局参数改变布局参数的方式,使用起来比较麻烦,因为需要具体情况具体实现。但是它是一种非常灵活的方法。具体理解起来也不难,原理就是改变控件的LayoutParams。使用举例:
//将按钮右移100像素的例子
MarginLayoutParams params = (MarginLayoutParams)mButton.getLayoutParams();
params.leftMargin += 100;
mButton.setLayoutParams(params);
至此对于如何实现View滑动的三种方式整理完毕转载请注明出处:http://blog.csdn.net/seu_calvin/article/details/52473373
Android开发中,我们常常需要View滑动实现一些绚丽的效果来优化用户体验。一般View的滑动可以用三种方式实现。
转载请注明出处:http://blog.csdn.net/seu_calvin/article/details/52473373
1. ScrollTo/ScrollBy
View提供了ScrollTo/ScrollBy专门用于View滑动,从下面源码可以看出,后者是使用前者来实现的:
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);
}
这里需要注意的是,View的两个属性mScrollX、mScrollY,分别可通过getScrollX和getScrollX方法获得。
mScrollX总是等于View左边缘和View内容左边缘在x轴方向的距离,同理理解mScrollY。我们在一个按钮上写上字,点击按钮后执行button.scrollTo(0,0)的逻辑,会发现按钮上的字位置不变,打印getScrollX/Y均为0。这就是所谓的内容和View边缘重合,即一开始的情况,如果执行的是button.scrollTo(100,100),按钮位置肯定不变,即不影响点击事件,但是字跑到左上方去了,这个字的位置肯定是比原来字的位置向上向左都移动了100个像素,即View内容的左上角和View本身的左上角相比向上向左都偏移了100个像素。这时候打印getScrollX/Y均为100。这和我们平时知道的屏幕坐标系是相反的。
总结:(1)简单方便,不会影响元素单击事件。(2)scrollTo()和scrollBy()移动的只是View的内容,并不能移动View本身,背景当然也是不移动的。如果是移动ViewGroup,移动的是所有的子View。 2. 动画动画可以实现非常复杂的动画效果,当然也可以实现View滑动的效果,原理是改变translationX、translationY的值。使用属性动画实例如下,View动画的例子略://使用属性动画,将View在1秒内向右平移50个像素
ObjectAnimator.ofFloat(mView, "translationX", 0 , 50).setDuration(1000).start();
需要注意的是,View动画有一个显著的缺点,那就是只对View的影像做操作,不会真正改变View的位置参数,因此可能对滑动后的新位置Button的点击事件失去响应。在系统眼里,这个Button没有发生任何改变。但是Android3.0以后属性动画解决了这个问题,3.0以下的可以通过设置两个按钮,并在恰当的时刻通过view.setVisibility间接解决该问题。
在动画的进行过程中,我们还可以设置监听器监听动画完成每一帧时,动画完成的比例。这样我们就可以完成更多的业务逻辑。
animator.addUpdateListener(new AnimatorUpdateListener(){
//动画完成一帧即回调
@override
public void onAnimationUpdate(ValueAnimator animator){
//获取动画完成比例
float faction = animator.getAnimatedFraction();
//完成其他效果
}
});
3. 改变布局参数改变布局参数的方式,使用起来比较麻烦,因为需要具体情况具体实现。但是它是一种非常灵活的方法。具体理解起来也不难,原理就是改变控件的LayoutParams。使用举例:
//将按钮右移100像素的例子
MarginLayoutParams params = (MarginLayoutParams)mButton.getLayoutParams();
params.leftMargin += 100;
mButton.setLayoutParams(params);
至此对于如何实现View滑动的三种方式整理完毕转载请注明出处:http://blog.csdn.net/seu_calvin/article/details/52473373
相关文章推荐
- Android开发——View滑动的三种实现方式
- android开发游记:RecycleView 实现复杂首页布局三种方式
- android开发游记:RecycleView 实现复杂首页布局三种方式
- Android面试整理之UI部分——实现View的弹性滑动的三种方式(二)
- android开发游记:RecycleView 实现复杂首页布局三种方式
- android开发游记:RecycleView 实现复杂首页布局三种方式
- android 三种实现水平向滑动方式(ViewPager、ViewFilpper、ViewFlow)的比较
- Android面试整理之UI部分——实现View的弹性滑动的三种方式(一)
- android 三种实现水平向滑动方式(ViewPager、ViewFilpper、ViewFlow)的比较
- android中三种方式实现水平滑动ViewPager,ViewFilpper,ViewFlow
- android 三种实现水平向滑动方式(ViewPager、ViewFilpper、ViewFlow)的比较
- android开发游记:RecycleView 实现复杂首页布局三种方式
- android开发游记:RecycleView 实现复杂首页布局三种方式
- android 三种实现水平向滑动方式(ViewPager、ViewFilpper、ViewFlow)的比较
- android中三种方式实现水平滑动ViewPager,ViewFilpper,ViewFlow
- 关于ViewPager、ViewFilpper、ViewFlow三种实现水平向滑动方式的比较
- Android开发之ViewPager结合Fragment实现滑动页面的效果(源代码分享)
- 关于ViewPager、ViewFilpper、ViewFlow三种实现水平向滑动方式的比较
- Android开发之ViewPager+ActionBar+Fragment实现响应式可滑动Tab
- Android腾讯微博客户端开发5:利用FootView实现ListView滑动动态加载实现分页