Android开源:CustomLayoutManager - 实现各种炫酷效果

carsonj 8年前
   <h2>效果图</h2>    <p style="text-align:center"><img src="https://simg.open-open.com/show/df3ac7c631f10f339547967fb08eca6f.gif"></p>    <p style="text-align:center">圆弧</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/25dcf59e8a25eeb546dd1513b996aee9.gif"></p>    <p style="text-align:center">缩放</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/d5703e83148cfe74e7de288d09a40ad7.gif"></p>    <p style="text-align:center">圆弧+缩放</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/d4a08922c2dd8362bbeda471909607ba.gif"></p>    <p style="text-align:center">画廊</p>    <h2>用法</h2>    <p>代码已上传Jcenter,在build.gradle中添加</p>    <pre>  <code class="language-java">compile 'rouchuan.customlayoutmanager:customlayoutmanager:1.0.1'</code></pre>    <p>然后新建一个自己的layoutManager并继承CustomLayoutManager,在这里先提一下,CustomLayoutManager有几个默认的属性是你可以直接使用的。</p>    <pre>  <code class="language-java">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;</code></pre>    <p>继承CustomLayoutManager之后你必须实现3个方法</p>    <pre>  <code class="language-java">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) {        }  }</code></pre>    <p>此外还有6个你可以选择重写的方法</p>    <pre>  <code class="language-java">//当子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;  }</code></pre>    <p> </p>    <p> </p>