美文网首页Android应用开发那些事高级UIAndroid
侧滑效果[第五篇]:侧滑框架SmartSwipe之弹性留白效果

侧滑效果[第五篇]:侧滑框架SmartSwipe之弹性留白效果

作者: NoBugException | 来源:发表于2019-11-12 11:44 被阅读0次

弹性留白,即侧滑时,有一段空白的区域,结束侧滑时,空白区域被View填充,整体的效果就和橡皮筋的拉伸效果类似。

首先看一下弹性留白效果:

278.gif

以上效果其实很常见,在SmartSwipe框架中使用SpaceConsumer可以做到弹性留白效果,代码如下:

SpaceConsumer.java

/**
 * @author billy.qi
 */
public class SpaceConsumer extends SwipeConsumer {

    public SpaceConsumer() {
        setSwipeDistanceCalculator(new ScaledCalculator(0.5F));
    }

    public SpaceConsumer(float scale) {
        setSwipeDistanceCalculator(new ScaledCalculator(scale));
    }

    @Override
    public void onDetachFromWrapper() {
        super.onDetachFromWrapper();
        View contentView = mWrapper.getContentView();
        if (contentView != null) {
            contentView.setTranslationX(0);
            contentView.setTranslationY(0);
        }
    }

    @Override
    public void onDisplayDistanceChanged(int distanceXToDisplay, int distanceYToDisplay, int dx, int dy) {
        View contentView = mWrapper.getContentView();
        if (contentView != null) {
            if (distanceXToDisplay >= 0 && isLeftEnable() || distanceXToDisplay <= 0 && isRightEnable()) {
                contentView.setTranslationX(distanceXToDisplay);
            }
            if (distanceYToDisplay >= 0 && isTopEnable() || distanceYToDisplay <= 0 && isBottomEnable()) {
                contentView.setTranslationY(distanceYToDisplay);
            }
        }
    }

}

ScaledCalculator.java

/**
 * The damping effect with scaled swipe distance
 * {@link SwipeConsumer} move distance = pointer move distance * scale
 * @author billy.qi
 */
public class ScaledCalculator implements SwipeDistanceCalculator {

    private float mScale;

    public ScaledCalculator(float scale) {
        if (scale <= 0) {
            throw new IllegalArgumentException("scale must be positive");
        }
        this.mScale = scale;
    }

    @Override
    public int calculateSwipeDistance(int swipeDistance, float progress) {
        return (int) (swipeDistance * mScale);
    }

    @Override
    public int calculateSwipeOpenDistance(int openDistance) {
        return (int) (openDistance / mScale);
    }
}

那么,该如何使用这个消费者呢?就以RecyclerView为例。

【让RecyclerView上边有弹性空白效果】

代码实现:

SmartSwipe.wrap(mRecyclerView).addConsumer(new SpaceConsumer()).enableTop();

【让RecyclerView下边有弹性空白效果】

代码实现:

SmartSwipe.wrap(mRecyclerView).addConsumer(new SpaceConsumer()).enableBottom();

【让RecyclerView左边有弹性空白效果】

代码实现:

SmartSwipe.wrap(mRecyclerView).addConsumer(new SpaceConsumer()).enableLeft();

【让RecyclerView右边有弹性空白效果】

代码实现:

SmartSwipe.wrap(mRecyclerView).addConsumer(new SpaceConsumer()).enableRight();

【让RecyclerView垂直方向有弹性空白效果】

代码实现:

SmartSwipe.wrap(mRecyclerView).addConsumer(new SpaceConsumer()).enableVertical();

【让RecyclerView水平方向有弹性空白效果】

代码实现:

SmartSwipe.wrap(mRecyclerView).addConsumer(new SpaceConsumer()).enableHorizontal();

【让RecyclerView所有方向有弹性空白效果】

代码实现:

SmartSwipe.wrap(mRecyclerView).addConsumer(new SpaceConsumer()).enableAllDirections();

效果如下:

280.gif

但是,从用户友好考虑,垂直方向的RecyclerView左右两边显然并不需要弹性留白效果,我们可以将弹性留白效果 加到Item上,用法也比较简单

@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View itemView = LayoutInflater.from(mContext).inflate(R.layout.recycleview_item, parent, false);
    ViewHolder holder = new ViewHolder(SmartSwipe.wrap(itemView).addConsumer(new SpaceConsumer()).enableHorizontal().getWrapper());
    return holder;
}

效果如下:

281.gif

【滑动距离计算器】

SpaceConsumer类中,有使用到ScaledCalculator类,ScaledCalculator是一个滑动距离计算器,我在SpaceConsumer中新增了一个构造方法:

public SpaceConsumer() {
    setSwipeDistanceCalculator(new ScaledCalculator(0.5F));
}

public SpaceConsumer(float scale) {
    setSwipeDistanceCalculator(new ScaledCalculator(scale));
}

不带参数的构造方法是框架自带的,带参数的构造方法是我新增的。

构造方法中有一个scale参数(阻力系数),scale的默认值是0.5,意思就是说,当滑动距离是10时,那么空白距离为10 * 0.5=5,所以,实际滑动距离和留白距离的计算工时如下:

distance = 实际滑动距离 * scale

[本章完...]

相关文章

网友评论

    本文标题:侧滑效果[第五篇]:侧滑框架SmartSwipe之弹性留白效果

    本文链接:https://www.haomeiwen.com/subject/fiyfictx.html