自定义LayoutManager实现弧形、滑动、画廊效果

github地址(完整Demo)
https://github.com/zhouxu88/CustomLayoutManager

最近浏览github,发现了一个特别炫酷的效果,可以用来让你的APP逼格更高,特此和大家分享一下。

效果图

自定义LayoutManager.gif

自定义customLayoutManager会帮你处理一部分放置、回收、以及滚动的逻辑,你只需关注你想随着滚动改变的属性,他是如何改变的,以及达到哪个值时会被回收即可。所以我们只需要新建一个自己的layoutManager并继承CustomLayoutManager,在这里先提一下,CustomLayoutManager有几个默认的属性是你可以直接使用的。

protected Context context;
//子view的宽度 
protected int mDecoratedChildWidth;
//子view的高度
protected int mDecoratedChildHeight;
//子view距离屏幕最左的偏移,也可以理解为第一个子view在初始状态下距离屏幕左侧的位移,默认居中
protected int startLeft; 
//子view距离屏幕顶部的位移,默认居中
protected int startTop; 
//主要随滑动所改变的属性的偏移量,考虑到view的属性有int,有float所以这边统一用float表示偏移
protected float offset;  
//相邻两个子view间,主要随滑动而改变的属性的差值(比如随滑动改变的是view的角度,那么这个值就是各个view之间的角度间隔)
protected float interval;

继承CustomLayoutManager之后你必须实现这几个方法

public class MyLayoutManager extends CustomLayoutManager{

    //默认isClockWise为true
    public MyLayoutManager(Context context) {
        super(context);
    }

    //isClockWise为true时从左往右排列,不然则从右往左排列
    public MyLayoutManager(Context context, boolean isClockWise) {
        super(context, isClockWise);
    }

   //这个方法会设置默认的interval变量,之后可以直接使用interval
    @Override
    protected float setInterval() {
        return 0;
    }

   //初始化方法,你可以在这里初始化自己的一些参数,比如实现圆弧布局的半径,或是更改一些默认的属性,比如startLeft,startTop
    @Override
    protected void setUp() {

    }

   //itemView就是每一个子view,targetOffset就是其对应的将要改变到的属性值,你可以在这里根据targetOffset对子view的一些属性进行设置
    @Override
    protected void setItemViewProperty(View itemView, float targetOffset) {

    }
}

此外还有6个你可以选择重写的方法

//当子view的属性超过这个值时,就会被回收掉
@Override
protected float maxRemoveOffset() {
    return getHorizontalSpace() - startLeft;
}

//当子view的属性小于这个值时,就会被回收掉
@Override
protected float minRemoveOffset() {
    return -mDecoratedChildWidth-getPaddingLeft() - startLeft;
}

//当view的属性等于targetOffset时,此view基于初始位置的x坐标,一般返回targetOffset
@Override
protected int calItemLeftPosition(float targetOffset) {
    return targetOffset;
}

//当view的属性等于targetOffset时,此view基于初始位置的y坐标,一般返回0
@Override
protected int calItemTopPosition(float targetOffset) {
    return 0;
}

//这边返回在滚动时子view主要改变的属性的值
@Override
protected float propertyChangeWhenScroll(View itemView) {
    return itemView.getLeft()-startLeft;
}

//滑动产生的偏移dx与offset的比例,默认为1
protected float getDistanceRatio(){
    return 1f;
}

参考:
https://github.com/leochuan/CustomLayoutManager

你可能感兴趣的:(自定义LayoutManager实现弧形、滑动、画廊效果)