Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

lkang08/Test

Folders and files

NameName
Last commit message
Last commit date

Latest commit

History

3 Commits

Repository files navigation

public class RecyclerViewDecoration extends RecyclerView.ItemDecoration { private ArrayList mItemInfos; private int mItemMargin; private int mItemLabelHeight; private int mItemDividerHeight; private int mItemLabelTextSize; private int mItemLabelTextTopPadding; private int mItemGapHeight; private int mLabelTextColor; private int mFloatCircleColor; private int mFloatCircleRadius; private boolean mReverse = true;

private Paint mLabelTextPaint;
private Paint mFloatCirclePaint;
private Paint mLabelAreaPaint;
private Paint mFloatCircleTextPaint;
private Drawable mItemDivider;
private Drawable mItemGap;
public RecyclerViewDecoration(Context context, ArrayList<ItemInfo> itemInfos) {
 this.mItemInfos = itemInfos;
 mItemMargin = context.getResources().getDimensionPixelSize(R.dimen.item_margin);
 mItemLabelHeight = context.getResources().getDimensionPixelSize(R.dimen.item_label_height);
 mItemDividerHeight = context.getResources().getDimensionPixelSize(R.dimen.item_divider_height);
 mItemLabelTextTopPadding = context.getResources().getDimensionPixelSize(R.dimen.item_label_text_top_padding);
 mItemGapHeight = context.getResources().getDimensionPixelSize(R.dimen.item_gap_height);
 mItemLabelTextSize = context.getResources().getDimensionPixelSize(R.dimen.item_label_text_size);
 mLabelTextColor = context.getResources().getColor(R.color.labelTextColor);
 mFloatCircleColor = context.getResources().getColor(R.color.itemGapColor);
 mFloatCircleRadius = 3 * mItemLabelTextSize / 2;
 mLabelTextPaint = new Paint();
 mLabelTextPaint.setColor(mLabelTextColor);
 mLabelTextPaint.setTypeface(Typeface.DEFAULT_BOLD);
 mLabelTextPaint.setTextSize(mItemLabelTextSize);
 mLabelAreaPaint = new Paint();
 mLabelAreaPaint.setColor(Color.WHITE);
 mFloatCirclePaint = new Paint();
 mFloatCirclePaint.setColor(mFloatCircleColor);
 mFloatCircleTextPaint = new Paint();
 mFloatCircleTextPaint.setColor(Color.WHITE);
 mFloatCircleTextPaint.setTypeface(Typeface.DEFAULT_BOLD);
 mFloatCircleTextPaint.setTextSize(2 * mItemLabelTextSize);
 if (context instanceof Activity) {
 Activity activity = (Activity) context;
 mItemDivider = activity.getResources().getDrawable(R.drawable.recycler_view_divider, null);
 mItemGap = activity.getResources().getDrawable(R.drawable.recycler_view_gap, null);
 }
}
private void drawGroupViewReverse(Canvas c, RecyclerView parent) {
 int childCount = parent.getChildCount();
 int itemCount = mItemInfos.size();
 //Log.d("lk", "drawGroupView childCount = " + childCount);
 for (int i = 0; i < childCount; i++) {
 View itemView = parent.getChildAt(i);
 int j = parent.getChildAdapterPosition(itemView);
 ItemInfo itemInfo = mItemInfos.get(j);
 //第0个位置不需要绘制
 if (j < itemCount - 1) {
 ItemInfo nextItemInfo = mItemInfos.get(j + 1);
 if (nextItemInfo.getAppNameInPinyin().charAt(0) != itemInfo.getAppNameInPinyin().charAt(0)) {
 //需要绘item上方item gap、label title及divider分隔线
 if ((nextItemInfo.getAppNameInPinyin().charAt(0) >= 'a' && nextItemInfo.getAppNameInPinyin().charAt(0) <= 'z')
 || (itemInfo.getAppNameInPinyin().charAt(0) >= 'a' && itemInfo.getAppNameInPinyin().charAt(0) <= 'z')) {
 mItemGap.setBounds(0, itemView.getBottom() + mItemLabelHeight + mItemDividerHeight,
 parent.getWidth(), itemView.getBottom() + mItemLabelHeight + mItemDividerHeight + mItemGapHeight);
 mItemGap.draw(c);
 mLabelTextPaint.setAntiAlias(true);
 char labelTitle = Character.toUpperCase(itemInfo.getAppNameInPinyin().charAt(0));
 if (!Character.isLetter(labelTitle)) {
 labelTitle = '#';
 }
 c.drawText("" + labelTitle, mItemMargin,
 itemView.getBottom() + mItemDividerHeight + mItemLabelTextTopPadding, mLabelTextPaint);
 mLabelTextPaint.setAntiAlias(false);
 mItemDivider.setBounds(mItemMargin, itemView.getBottom(), itemView.getWidth() + mItemMargin, itemView.getBottom() + mItemDividerHeight);
 mItemDivider.draw(c);
 }
 } else {
 //仅绘item下方的divider分隔线
 mItemDivider.setBounds(mItemMargin, itemView.getBottom(), itemView.getWidth() + mItemMargin, itemView.getBottom() + mItemDividerHeight);
 mItemDivider.draw(c);
 }
 } else if (j == itemCount - 1) {
 mItemGap.setBounds(0, itemView.getBottom() + mItemLabelHeight + mItemDividerHeight,
 parent.getWidth(), itemView.getBottom() + mItemLabelHeight + mItemDividerHeight + mItemGapHeight);
 mItemGap.draw(c);
 mLabelTextPaint.setAntiAlias(true);
 char labelTitle = Character.toUpperCase(itemInfo.getAppNameInPinyin().charAt(0));
 if (!Character.isLetter(labelTitle)) {
 labelTitle = '#';
 }
 c.drawText("" + labelTitle, mItemMargin,
 itemView.getBottom() + mItemDividerHeight + mItemLabelTextTopPadding, mLabelTextPaint);
 mLabelTextPaint.setAntiAlias(false);
 mItemDivider.setBounds(mItemMargin, itemView.getBottom(), itemView.getWidth() + mItemMargin, itemView.getBottom() + mItemDividerHeight);
 mItemDivider.draw(c);
 }
 }
}
@Override
public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) {
 super.onDraw(c, parent, state);
 drawGroupViewReverse(c, parent);
}
private void drawFlaotView(Canvas c, RecyclerView parent) {
 int lastChildIndex = parent.getChildCount() - 1;
 View lastChild = parent.getChildAt(lastChildIndex);
 ItemInfo lastItemInfo = mItemInfos.get(parent.getChildAdapterPosition(lastChild));
 char floatLabelTitle = Character.toUpperCase(lastItemInfo.getAppNameInPinyin().charAt(0));
 int floatLabelTranslationY = 0;
 int screenHeight = Utilities.getDisplayMetrics(parent.getContext()).heightPixels;
 char floatCircleTitle = lastItemInfo.getAppNameInDefault().charAt(0);
 int childCount = parent.getChildCount();
 //screenHeight = screenHeight - 75;
 for (int i = 0; i < parent.getChildCount(); i++) {
 View childView = parent.getChildAt(i);
 int adapterPosition = parent.getChildAdapterPosition(childView);
 if (adapterPosition == mItemInfos.size() - 1) {
 continue;
 }
 //找到当前recyclerView中第一个带有Label的Item
 if (parent.findChildViewUnder(mItemMargin + childView.getWidth() / 2,
 childView.getBottom() + mItemDividerHeight + mItemLabelHeight / 2) == null) {
 //第二个Label将第一个Label顶上去的情况
 if ((childView.getBottom() > screenHeight - 75 - 2 * mItemLabelHeight - mItemDividerHeight)
 && childView.getBottom() < screenHeight - 75) {
 floatLabelTitle = Character.toUpperCase(mItemInfos.get(adapterPosition).getAppNameInPinyin().charAt(0));
 floatLabelTranslationY = 2 * mItemLabelHeight - (screenHeight - childView.getBottom());
 Log.d("lk", "floatLabelTranslationY = " + floatLabelTranslationY +
 ",bottom = " + childView.getBottom() + ",title = " + mItemInfos.get(adapterPosition).getAppNameInDefault());
 break;
 }
 }
 }
 c.drawRect(new Rect(0, screenHeight - mItemLabelHeight - 75 + floatLabelTranslationY,
 parent.getWidth(), screenHeight - 75 + floatLabelTranslationY), mLabelAreaPaint);
 mItemDivider.setBounds(0, screenHeight - mItemLabelHeight - mItemDividerHeight - 75 + floatLabelTranslationY,
 parent.getWidth(), screenHeight - mItemLabelHeight - 75);
 mItemDivider.draw(c);
 mLabelTextPaint.setAntiAlias(true);
 if (!Character.isLetter(floatLabelTitle)) {
 floatLabelTitle = '#';
 }
 c.drawText("" + floatLabelTitle, mItemMargin, mItemLabelTextTopPadding + screenHeight - mItemLabelHeight - 75 + floatLabelTranslationY, mLabelTextPaint);
 mLabelTextPaint.setAntiAlias(false);
 /*if (parent.getScrollState() != RecyclerView.SCROLL_STATE_IDLE) {
 mFloatCirclePaint.setAntiAlias(true);
 c.drawCircle(Utilities.getDisplayMetrics(parent.getContext()).widthPixels / 2,
 Utilities.getDisplayMetrics(parent.getContext()).heightPixels / 2, mFloatCircleRadius, mFloatCirclePaint);
 mFloatCirclePaint.setAntiAlias(false);
 mFloatCircleTextPaint.setAntiAlias(true);
 //设置文本水平左右居中
 mFloatCircleTextPaint.setTextAlign(Paint.Align.CENTER);
 Paint.FontMetrics fm = mFloatCircleTextPaint.getFontMetrics();
 float y = Utilities.getDisplayMetrics(parent.getContext()).heightPixels / 2 - fm.descent + (fm.bottom - fm.top) / 2;
 c.drawText("" + floatCircleTitle, Utilities.getDisplayMetrics(parent.getContext()).widthPixels / 2,
 y, mFloatCircleTextPaint);
 mFloatCircleTextPaint.setAntiAlias(false);
 }*/
}
@Override
public void onDrawOver(Canvas c, RecyclerView parent, RecyclerView.State state) {
 super.onDrawOver(c, parent, state);
 drawFlaotView(c, parent);
}
@Override
public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
 super.getItemOffsets(outRect, view, parent, state);
 int count = mItemInfos.size();
 int childPosition = parent.getChildAdapterPosition(view);
 ItemInfo itemInfo = mItemInfos.get(childPosition);
 if (childPosition == count - 1) {
 outRect.set(0, 0, 0, mItemLabelHeight + mItemDividerHeight);
 } else {
 ItemInfo nextItemInfo = mItemInfos.get(childPosition + 1);
 if (nextItemInfo.getAppNameInPinyin().charAt(0) != itemInfo.getAppNameInPinyin().charAt(0)) {
 if ((nextItemInfo.getAppNameInPinyin().charAt(0) >= 'a' && nextItemInfo.getAppNameInPinyin().charAt(0) <= 'z')
 || (itemInfo.getAppNameInPinyin().charAt(0) >= 'a' && itemInfo.getAppNameInPinyin().charAt(0) <= 'z')) {
 outRect.set(0, 0, 0, mItemGapHeight + mItemLabelHeight + mItemDividerHeight);
 }
 } else {
 outRect.set(0, 0, 0, mItemDividerHeight);
 }
 }
}

}

About

test git

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

AltStyle によって変換されたページ (->オリジナル) /