Android View实现滑动的方式

目录

  • 简述
  • 使用scrollTo/scrollBy
  • 使用动画
    • 平移动画
    • 属性动画
  • 改变布局参数 LayoutParams
  • 总结
    • scrollTo/scrollBy: 操作简单,适合对View内容的滑动
    • 动画:操作简单,主要适用于没有交互的View和实现复杂的动画。
    • 改变布局参数:操作稍微复杂,适用于有交互的View

简述

实现View的滑动有三种方式

  1. 通过View本身提供的scrollTo/scrollBy方法实现滑动
  2. 通过动画给View施加平移效果来实现滑动
  3. 通过改变View LayoutParams使得View重新布局从而实现滑动

使用scrollTo/scrollBy

scrollTo:通过传递的参数实现绝对滑动
scrollBy:通过传递的参数实现相对滑动

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


    /**
     * The offset, in pixels, by which the content of this view is scrolled
     * horizontally.
     * Please use {@link View#getScrollX()} and {@link View#setScrollX(int)} instead of
     * accessing these directly.
     * {@hide}
     */
    @ViewDebug.ExportedProperty(category = "scrolling")
    @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P)
    protected int mScrollX;
    /**
     * The offset, in pixels, by which the content of this view is scrolled
     * vertically.
     * Please use {@link View#getScrollY()} and {@link View#setScrollY(int)} instead of
     * accessing these directly.
     * {@hide}
     */
    @ViewDebug.ExportedProperty(category = "scrolling")
    @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P)
    protected int 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();
            }
        }
    }

    /**
     * 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);
    }

    /**
     * Return the scrolled left position of this view. This is the left edge of
     * the displayed part of your view. You do not need to draw any pixels
     * farther left, since those are outside of the frame of your view on
     * screen.
     *
     * @return The left edge of the displayed part of your view, in pixels.
     */
    @InspectableProperty
    public final int getScrollX() {
        return mScrollX;
    }

    /**
     * Return the scrolled top position of this view. This is the top edge of
     * the displayed part of your view. You do not need to draw any pixels above
     * it, since those are outside of the frame of your view on screen.
     *
     * @return The top edge of the displayed part of your view, in pixels.
     */
    @InspectableProperty
    public final int getScrollY() {
        return mScrollY;
    }

从源码上看,scrollBy通过调用scrollTo方法,来实现了基于当前位置的相对滑动。
通过getScrollX、 getScrollY分别获取到mScrollX、mScrollY。
mScrollX、mScrollY单位为像素

使用动画

使用动画来移动View,主要操作View的translationX和translationY属性,可以采用属性动画或者平移动画。
属性动画需要Android3.0以上的版本。
动画并不能真正改变View的位置信息(四个顶点和宽高)。因此在一个View移动到新位置后,单击新位置无法触发onClick事件(平移)。
解决方法:两种方法

  1. 使用属性动画代替平移动画;
  2. 可以在新位置预先创建一个和目标View一模一样的View,他们不但外观一样连onClick事件也一样,当目标View完成平移动画后,就把目标View 设置GONE(textView.setVisibility(View.GONE) ),同时预先设置的View显示出来。

android 动画

平移动画

文件名:translate.xml




    


fillAfter:作用View动画执行完是否恢复到动画前的状态。
true:View会停留在动画执行完的状态。
false: VIew会恢复到动画前的状态。

代码调用

 AnimationSet animationSet2=(AnimationSet) AnimationUtils.loadAnimation(this, R.anim.translate);
 textView.startAnimation(animationSet2);

属性动画

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

改变布局参数 LayoutParams

    ViewGroup.LayoutParams layoutParams = textView.getLayoutParams();
    layoutParams.width+=100;
    layoutParams.height=100;
    textView.requestLayout();
    //或者 textView.setLayoutParams(layoutParams);

通过改变LayoutParams 的方式区实现View的滑动同样是一种很灵活的方法。不过需要根据实际情况做不同的处理。

总结

scrollTo/scrollBy: 操作简单,适合对View内容的滑动

是View提供的原生方法,其作用是专门用于View的滑动,比较方便地实现滑动效果并不影响内部元素的单击事件。只能滑动View的内容,并不能滑动View本身。

动画:操作简单,主要适用于没有交互的View和实现复杂的动画。

通过动画来实现View的滑动。优点:就是复杂的动画效果必须通过动画才能实现。使用平移动画的话需要注意的是View的单击事件(fillAfter 为true的情况)。

改变布局参数:操作稍微复杂,适用于有交互的View

主要适用有交互性的View.

你可能感兴趣的:(android,滑动,动画,LayoutParams,scrollBy,scrollTo)