专栏名称: 安卓开发精选
伯乐在线旗下账号,分享安卓应用相关内容,包括:安卓应用开发、设计和动态等。
目录
相关文章推荐
51好读  ›  专栏  ›  安卓开发精选

安卓当下最流行的吸顶效果的实现(下)

安卓开发精选  · 公众号  · android  · 2017-01-12 21:12

正文

(点击 上方公众号 ,可快速关注)

来源:李诗雨

http://blog.csdn.net/cjm2484836553/article/details/53453982

如有好文章投稿,请点击 → 这里了解详情


接上文


第一步 :首先我们来写一个类,它起标记的作用,来放每一个item的对应的悬浮栏的字符串


public class NameBean {

String name ;

public String getName () {

return name ;

}

public void setName ( String name ) {

this . name = name ;

}

}


第二步 :自定义一个SectionDecoration 类 继承 RecyclerView的ItemDecoration


public class SectionDecoration extends RecyclerView . ItemDecoration {

private static final String TAG = "SectionDecoration" ;

private List dataList ;

private DecorationCallback callback ;

private TextPaint textPaint ;

private Paint paint ;

private int topGap ;

private int alignBottom ;

private Paint . FontMetrics fontMetrics ;

public SectionDecoration ( List dataList , Context context , DecorationCallback decorationCallback ) {

Resources res = context . getResources ();

this . dataList = dataList ;

this . callback = decorationCallback ;

//设置悬浮栏的画笔---paint

paint = new Paint ();

paint . setColor ( res . getColor ( R . color . colorGray ));

//设置悬浮栏中文本的画笔

textPaint = new TextPaint ();

textPaint . setAntiAlias ( true );

textPaint . setTextSize ( DensityUtil . dip2px ( context , 14 ));

textPaint . setColor ( Color . DKGRAY );

textPaint . setTextAlign ( Paint . Align . LEFT );

fontMetrics = new Paint . FontMetrics ();

//决定悬浮栏的高度等

topGap = res . getDimensionPixelSize ( R . dimen . sectioned_top );

//决定文本的显示位置等

alignBottom = res . getDimensionPixelSize ( R . dimen . sectioned_alignBottom );

}

@Override

public void getItemOffsets ( Rect outRect , View view , RecyclerView parent , RecyclerView . State state ) {

super . getItemOffsets ( outRect , view , parent , state );

int pos = parent . getChildAdapterPosition ( view );

Log . i ( TAG , "getItemOffsets:" + pos );

String groupId = callback . getGroupId ( pos );

if ( groupId . equals ( "-1" )) return ;

//只有是同一组的第一个才显示悬浮栏

if ( pos == 0 || isFirstInGroup ( pos )) {

outRect . top = topGap ;

if ( dataList . get ( pos ). getName () == "" ) {

outRect . top = 0 ;

}

} else {

outRect . top = 0 ;

}

}

@Override

public void onDraw ( Canvas c , RecyclerView parent , RecyclerView . State state ) {

super . onDraw ( c , parent , state );

int left = parent . getPaddingLeft ();

int right = parent . getWidth () - parent . getPaddingRight ();

int childCount = parent . getChildCount ();

for ( int i = 0 ; i childCount ; i ++ ) {

View view = parent . getChildAt ( i );

int position = parent . getChildAdapterPosition ( view );

String groupId = callback . getGroupId ( position );

if ( groupId . equals ( "-1" )) return ;

String textLine = callback . getGroupFirstLine ( position ). toUpperCase ();

if ( textLine == "" ) {

float top = view . getTop ();

float bottom = view . getTop ();

c . drawRect ( left , top , right , bottom , paint );

return ;

} else {

if ( position == 0 || isFirstInGroup ( position )) {

float top = view . getTop () - topGap ;

float bottom = view . getTop ();

//绘制悬浮栏

c . drawRect ( left , top - topGap , right , bottom , paint );

//绘制文本

c . drawText ( textLine , left , bottom ,







请到「今天看啥」查看全文