View的滑动

View的滑动,用途很多,下拉刷新,通过滑动影藏和显示可以实现更多功能。主要实现方式包括一下三种:

  • 通过View本身提供的scrollTo/scrollBy方式来滑动
  • 通过动画,给View施加移动来实现滑动效果
  • 通过改变View的LayoutParams使得View重新布局,从而实现滑动

1、使用scrollTo/scrollBy

这两个方法是View自身提供的,来实现滑动效果,实现如下:
/**
*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();
		}
	}
}
/**
*Move 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 amount of pixels to scroll by horizontally
*@param y the amount of pixels to scroll by vertically
*/
public void scrollBy(int x,int y){
	scrollTo(mScrollX+x,mScrollY+y);
}

源码中可以看出,scrollBy还是调用了scrollTo方法,滑动过程中,内部两个重要的属性,mScrollX、mScrollY,这两个属性可以通过gerScrollx/getScrollY获取。
需要注意,mScrollX的值一直等于View左边缘和View内容左边缘的水平距离,mScrollY的值等于view上边缘和view内容上边缘的竖直距离。view的边缘是指四个顶点,view的内容边缘是指view内的内容边缘。scrollTo/scrollBy只能改变view内容的位置,而不能改变view在布局中的位置。mScrollX/mScrollY的单位为像素,且View左边缘在View内容右边缘时,mScrollX为正,反之为负。view上边缘在view内容上边缘的上边时,mScrollY为负,反之为正数。换言之,从左向右滑,mScrollX为负,反之为正,从上往下滑,mScrollY为负,反之为正。
已100像素为例,说明mScrollX/mScrollY的变化。移动view内容,而view的位置始终不变,如图:
在这里插入图片描述

2、使用动画

上面介绍的scrollTo/scrollBy来实现View的滑动,只能移动view的内容,而动画,能够让一个View移动起来。主要是操作ViewtranslationX和translationY属性,既可以采用传统的View动画,也可以采用属性动画,如果使用属性动画,为了能兼容3.0以下的版本,需要采用开源的动画库nineoldandroids(http://nineoldandroids.com/)
采用View动画示例,如下。将一个View从原始位置向右下角移动100像素。

<?mxl version=1.0” encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
	android:fillAfter="true"
	android:zAdjustment= "normal">
	 <translate
 		android:duration="100"
 		android:fromXDelta="0"
 		android:fromYDelta="0"
 		android:interpolator="@android:anim/linear_interpolator"
		android:toXDelta="100"
 		android:toYDelta="100">
 </set>

采用属性动画的话,示例代码如下:
ObjectAnimator.ofFloat(targetView,“translationX”,0,).setDuration(100).start();
需要注意:
1.采用动画做View的滑动,是对View的影像做操作,它不能改变view的位置参数,宽高等如果需要保留动画后的效果,fillAfter属性需要设置为true,否则,动画在完成的那一瞬间,view会恢复到原始状态。
2.通过动画移动View后,因为View的本身位置没有改变,所以移动后的View将失去原先的onClick事件,从Android3.0开始属性动画可以解决这个问题。但大多都需要兼容到android2.2.

3.改变布局参数

通过改变布局参数滑动View就是改变LayoutParams属性,如下:

	MarginLayoutParams params = (MarginLayoutParams)mButtonl.getLayoutParams();
	params.width += 100;
	params.leftMargin += 100;
	params.requestLayout();
	//或者
	mButton.setLayoutParams(params);

4.各种滑动方式的对比

1.scrollTo/scrollBy:它是View的原生方法,专门用于IV额外的滑动,它可以比较方便的实现滑动效果,且不影响内部元素的点击事件,但他的缺点是只能移动View的内容,而不能移动View本身。
2.动画:动画的话分两种情况,如果是Android3.0以上的并采用属性动画,没什么明显的缺点,但如果使用的是View动画,或者Android3.0以下使用属性动画,都不能改变View本身的属性。所以在开发中,如果动画没有用户交互的属性无所谓,但如果有交互属性则不行。
3.改变布局属性:除了使用起来比较麻烦,没什么明显缺点,它主要适用于具有交互属性的View。
总结:

  • scrollTo/scrollBy:操作简单,适用于View内容的滑动。
  • 动画:操作简单,主要适用于没有交互属性的View和实现复杂的动画效果。
  • 改变布局参数:操作稍微复杂,适用于具有交互属性的View。

特别声明:内容总结来源《Android开发艺术探索》,仅记录学习,如有侵权或不对之处,还请告知,定当删除或改正

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

这个Bug有点难搞

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值