简述
实现View的滑动有三种方式
- 通过View本身提供的scrollTo/scrollBy方法实现滑动
- 通过动画给View施加平移效果来实现滑动
- 通过改变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事件(平移)。
解决方法:两种方法
- 使用属性动画代替平移动画;
- 可以在新位置预先创建一个和目标View一模一样的View,他们不但外观一样连onClick事件也一样,当目标View完成平移动画后,就把目标View 设置GONE(textView.setVisibility(View.GONE) ),同时预先设置的View显示出来。
android 动画
平移动画
文件名:translate.xml
<?xml 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>
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的情况)。文章来源:https://www.toymoban.com/news/detail-602907.html
改变布局参数:操作稍微复杂,适用于有交互的View
主要适用有交互性的View.文章来源地址https://www.toymoban.com/news/detail-602907.html
到了这里,关于Android View实现滑动的方式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!