Android View的滑动

本文详细介绍了Android中视图动画的实现原理与应用方法,包括scrollTo/scrollBy的基础概念、补间动画与属性动画的区别及使用场景,以及如何通过不同方式实现视图的弹性滑动效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

scrollTo/scrollBy

mScrollX:View左边缘和View内容左边缘在水平方向上的距离。

mScrollY.View上边缘和View内容上边缘在竖直方向上的距离。

scrollTo和scrollBy只能改变View内容的位置而不能改变View在布局中的位置。

单位:像素。

动画

使用动画来移动View,主要是操作View的translationX和translationY属性。

View Animation(Tween Animation) 补间动画
Drawable Animation(Frame Animation) 逐帧动画
Property Animation 属性动画

补间动画

间动画,给出两个关键帧,通过一些算法将给定属性值在给定的时间内在两个关键帧间渐变,只能应用于View对象,而且只支持支持旋转、渐变、移动、缩放属性,而不支持背景颜色的改变。而且只是改变了View对象绘制的位置,而没有改变View对象本身.

View动画并不能真正改变View的位置,变换后的View并不会响应点击事件。属性动画可以解决上述问题。但属性动画从Android3.0后才能使用,无法兼容到Android2.2.

Tween Animation实现的效果

1.Alpha:淡入淡出效果
2.Scale:缩放效果
3.Rotate:旋转效果
4.Translate:移动效果

Tween Animation的通用方法

1.setDuration(longdurationMills)动画持续时间(单位:毫秒)
2.setFillAfter(BooleanfillAfter)如果fillAfter的值为true,则动画执行后,控件将停留在执行结束的状态
3.setFillBefore(BooleanfillBefore)如果fillBefore的值为true,则动画执行后,控件将回到动画执行之前的状态
4.setStartOffSet(longstartOffSet)设置动画执行之前的等待时间
5.setRepeatCount(intrepeatCount)设置动画重复执行的次数

Animation的四个子类:AlphaAnimationTranslateAnimationScaleAnimationRotateAnimation

属性动画

ObjectAnimator.ofFloat(targetView, "translationX", 0 , 100).setDuration(100).start();

改变布局参数

ViewGroup.MarginLayoutParams params = (ViewGroup.MarginLayoutParams) mButtonToShow.getLayoutParams();
params.width += 100;
params.leftMargin += 100;
mButtonToShow.requestLayout();
//mButtonToShow.setLayoutParams(params);

弹性滑动的三种实现方式

Scroller实现

mSroller = new Scroller(context);
mSroller.startScroll(getScrollX(),getScrollY(),dx,dy);
invalidate();

@Override
public void computeScroll() {
    if(mSroller.computeScrollOffset()){
        scrollTo(mSroller.getCurrX(),mSroller.getCurrY());
        postInvalidate();
    }
}

invalidate() draw() computerScroll() 循环调用,实现动画的完成。
在方法computeScroll()中,计算了当前的scrollX,scrollY,返回值为true时,表示动画没有完成,继续下一次绘制。

动画实现

属性动画实现View弹性滑动

ObjectAnimator.ofFloat(targetView, "translationX", 0, 100).setDuration(100),start();

另一种形式

final int startX = 0;

final int deltaX = 0;

ValueAnimator animator = ValueAnimator.ofInt(0,1).setDuration(1000);

animator.addUpdateListener(new AnimatorUpdateListener(){

   @Override

   public void onAnimatorUpdate(ValueAnimator animator){

       float fraction = animator.getAnimatedFraction();

      mButton1.scrollTo(startX + (int) (deltaX * fraction) , 0);//此处可以实现以时间为参数进行变化的复杂动画。

   }

});

延时策略实现

使用Handler或View的postDelayed方法,也可以使用线程的sleep方法,发送一系列延时消息从而达到一种渐近式的效果。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值