android卡片 弹簧滑动,如何在滚动android时拉类似于弹性类型的布局?

我有每个布局,看起来像在Scrollview中嵌入的卡片类型。当我滚动时,如何像弹簧式那样移动卡片,然后回到原始位置。如何在滚动android时拉类似于弹性类型的布局?

这就像卡片弹跳。在我的布局中,顶部是ScrollView,低于5到6布局是集成的。

当我滚动如何将这些添加的布局移动一点点,并到达它的位置?你可以在这里看到一个例子。只需看一下滚动卡片 从其位置移动。只要看到screenshot注意到上下滚动时卡片移动的位置就像弹簧类型,即滚动时卡片之间的间距减小。如何实现这一目标?

在当前应用的CustomScrollView中,它有过度滚动但我无法实现弹簧式可移动卡。

这是我应用的代码。

xmlns:app="http://schemas.android.com/apk/res-auto"

xmlns:tools="http://schemas.android.com/tools"

android:id="@+id/coordinatorLayout"

android:layout_width="match_parent"

android:layout_height="match_parent"

tools:context=".LaunchActivity">

android:layout_width="match_parent"

android:layout_height="match_parent">

android:id="@+id/backgroundImage_timeline"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:background="@drawable/bg_dot_line"

android:scaleType="centerCrop" />

android:id="@+id/scrollView"

android:layout_width="match_parent"

android:layout_height="match_parent"

tools:context=".LaunchActivity">

android:layout_width="match_parent"

android:layout_height="wrap_content">

android:id="@+id/commonModules"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:layout_below="@id/anotherModule"

android:orientation="vertical">

android:id="@+id/myFirstModule"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:visibility="visible" />

and so on..

public class ObservableScrollView extends ScrollView {

private View inner;

private float y;

private Rect normal = new Rect();

private boolean isCount = false;

public interface OnOverScrolledListener {

void onOverScrolled(android.widget.ScrollView scrollView,

int deltaX, int deltaY, boolean clampedX, boolean clampedY);

}

private OnOverScrolledListener mOnOverScrolledListener;

private int mOverScrollByDeltaX;

private int mOverScrollByDeltaY;

@Override protected boolean overScrollBy(int deltaX, int deltaY, int scrollX, int scrollY, int scrollRangeX, int scrollRangeY, int maxOverScrollX, int maxOverScrollY, boolean isTouchEvent) {

this.mOverScrollByDeltaX = deltaX;

this.mOverScrollByDeltaY = deltaY;

final boolean result = super.overScrollBy(deltaX, deltaY, scrollX, scrollY, scrollRangeX, scrollRangeY, maxOverScrollX, maxOverScrollY, isTouchEvent);

return result;

};

@Override

protected void onOverScrolled(int scrollX, int scrollY, boolean clampedX, boolean clampedY) {

super.onOverScrolled(scrollX, scrollY, clampedX, clampedY);

if (mOnOverScrolledListener != null && (clampedX || clampedY)) {

mOnOverScrolledListener.onOverScrolled(this, mOverScrollByDeltaX, mOverScrollByDeltaY, clampedX, clampedY);

}

}

public OnOverScrolledListener getOnOverScrolledListener() {

return mOnOverScrolledListener;

}

public void setOnOverScrolledListener(OnOverScrolledListener onOverScrolledListener) {

this.mOnOverScrolledListener = onOverScrolledListener;

}

public ObservableScrollView(Context context, AttributeSet attrs) {

super(context, attrs);

}

@SuppressLint("MissingSuperCall")

@Override

protected void onFinishInflate() {

if (getChildCount() > 0) {

inner = getChildAt(0);

}

}

@Override

public boolean onTouchEvent(MotionEvent ev) {

if (inner != null) {

commOnTouchEvent(ev);

}

return super.onTouchEvent(ev);

}

public void commOnTouchEvent(MotionEvent ev) {

int action = ev.getAction();

switch (action) {

case MotionEvent.ACTION_DOWN:

break;

case MotionEvent.ACTION_UP:

if (isNeedAnimation()) {

animation();

isCount = false;

}

break;

case MotionEvent.ACTION_MOVE:

final float preY = y;

float nowY = ev.getY();

int deltaY = (int) (preY - nowY);

if (!isCount) {

deltaY = 0;

}

y = nowY;

if (isNeedMove()) {

if (normal.isEmpty()) {

normal.set(inner.getLeft(), inner.getTop(),

inner.getRight(), inner.getBottom());

}

inner.layout(inner.getLeft(), inner.getTop() - deltaY/2,

inner.getRight(), inner.getBottom() - deltaY/2);

}

isCount = true;

break;

default:

break;

}

}

public void animation() {

TranslateAnimation ta = new TranslateAnimation(0, 0, inner.getTop(),

normal.top);

ta.setDuration(200);

inner.startAnimation(ta);

inner.layout(normal.left, normal.top, normal.right, normal.bottom);

normal.setEmpty();

}

public boolean isNeedAnimation() {

return !normal.isEmpty();

}

public boolean isNeedMove() {

int offset = inner.getMeasuredHeight() - getHeight();

int scrollY = getScrollY();

if (scrollY == 0 || scrollY == offset) {

return true;

}

return false;

}

}

那么另类,我试图,

if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) {

scrollView.setOnScrollChangeListener(new View.OnScrollChangeListener() {

@Override

public void onScrollChange(View v, int scrollX, int scrollY, int oldScrollX, int oldScrollY) {

View view = (View) scrollView.getChildAt(scrollView.getChildCount() - 1);

int diff = (view.getBottom() - (scrollView.getHeight() + scrollView.getScrollY()));

if(view.getTop()==scrollY){

// reaches the top end

Log.e("scrolled top","scrolling top");

}

// if diff is zero, then the bottom has been reached

if (diff == 0) {

// do stuff L

Log.e("bottom reached","bottom reached");

}

else {

TranslateAnimation animation = new TranslateAnimation(0f, 0f, 0f, -100f); // might need to review the docs

animation.setDuration(500); // set how long you want the animation

animation.setFillAfter(true);

myFirstModule.startAnimation(animation);

mySecondModule.startAnimation(animation);

//till 10..

}

}

});

}

但是,这是没有得到滚动过程中应用。滚动后的动画有一些延迟,视图上升,而不是完美的。

2016-11-25

Shadow

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值