android - 回收站视图的垂直指示器
问题描述
请看这个我有类似的垂直回收器视图,但我想要一个类似于滚动下面的智能标签布局链接的效果我有两个垂直的回收器视图。每当我在 Recycler 视图 2 中滚动 10 个项目时,我都会将 Recycler View 1 滚动到下一个位置。
使用这个
rec2.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
int currFirstPos = mLayoutManager4.findFirstCompletelyVisibleItemPosition();
int currLastPos = mLayoutManager4.findLastCompletelyVisibleItemPosition();
if (oldFirstPos==-1){
totalItemsViewed = totalItemsViewed+currLastPos - currFirstPos + 1;
}
else{
if (dy>0){
totalItemsViewed= totalItemsViewed+currLastPos - oldLastPos;
// Toast.makeText(getContext(), "total item viewed"+totalItemsViewed, Toast.LENGTH_SHORT).show();
changeState(totalItemsViewed,"up");
}else {
totalItemsViewed=totalItemsViewed+currFirstPos - oldFirstPos;
// Toast.makeText(getContext(), "total item viewed"+totalItemsViewed, Toast.LENGTH_SHORT).show();
changeState(totalItemsViewed,"down");
}
}
oldLastPos = currLastPos;
oldFirstPos = currFirstPos;
}
});
更改状态方法将 imageRecycler 视图滚动到某个位置并更改图像以在回收器视图中显示选定的图像。
private void changeState(int position,String direction){
if (position<7){
adapter.changeImage(1);
catImageRec.scrollToPosition(1);
}
// and the rest of the code
}
我想为我的 Recycler View1 创建一个垂直指示器来实现这种效果。![指标] https://raw.githubusercontent.com/ogaclejapan/SmartTabLayout/master/art/demo4.gif
所以我想到了使用项目装饰并在这里找到了这段代码,但它是用于水平指示器的,而且它没有在视图中显示指示器,而是在回收器视图上显示
public class CirclePagerIndicatorDecoration extends RecyclerView.ItemDecoration {
private int colorActive = 0xDE000000;
private int colorInactive = 0x33000000;
private static final float DP = Resources.getSystem().getDisplayMetrics().density;
/**
* Height of the space the indicator takes up at the bottom of the view.
*/
private final int mIndicatorHeight = (int) (DP * 16);
/**
* Indicator stroke width.
*/
private final float mIndicatorStrokeWidth = DP * 4;
/**
* Indicator width.
*/
private final float mIndicatorItemLength = DP * 4;
/**
* Padding between indicators.
*/
private final float mIndicatorItemPadding = DP * 8;
/**
* Some more natural animation interpolation
*/
private final Interpolator mInterpolator = new AccelerateDecelerateInterpolator();
private final Paint mPaint = new Paint();
public CirclePagerIndicatorDecoration() {
mPaint.setStrokeWidth(mIndicatorStrokeWidth);
mPaint.setStyle(Paint.Style.STROKE);
mPaint.setAntiAlias(true);
}
@Override
public void onDrawOver(Canvas c, RecyclerView parent, RecyclerView.State state) {
super.onDrawOver(c, parent, state);
int itemCount = parent.getAdapter().getItemCount();
// center horizontally, calculate width and subtract half from center
float totalLength = mIndicatorItemLength * itemCount;
float paddingBetweenItems = Math.max(0, itemCount - 1) * mIndicatorItemPadding;
float indicatorTotalWidth = totalLength + paddingBetweenItems;
float indicatorStartX = (parent.getWidth() - indicatorTotalWidth) / 2F;
// center vertically in the allotted space
float indicatorPosY = parent.getHeight() - mIndicatorHeight / 2F;
drawInactiveIndicators(c, indicatorStartX, indicatorPosY, itemCount);
// find active page (which should be highlighted)
LinearLayoutManager layoutManager = (LinearLayoutManager) parent.getLayoutManager();
int activePosition = layoutManager.findFirstVisibleItemPosition();
if (activePosition == RecyclerView.NO_POSITION) {
return;
}
// find offset of active page (if the user is scrolling)
final View activeChild = layoutManager.findViewByPosition(activePosition);
int left = activeChild.getLeft();
int width = activeChild.getWidth();
int right = activeChild.getRight();
// on swipe the active item will be positioned from [-width, 0]
// interpolate offset for smooth animation
float progress = mInterpolator.getInterpolation(left * -1 / (float) width);
drawHighlights(c, indicatorStartX, indicatorPosY, activePosition, progress);
}
private void drawInactiveIndicators(Canvas c, float indicatorStartX, float indicatorPosY, int itemCount) {
mPaint.setColor(colorInactive);
// width of item indicator including padding
final float itemWidth = mIndicatorItemLength + mIndicatorItemPadding;
float start = indicatorStartX;
for (int i = 0; i < itemCount; i++) {
c.drawCircle(start, indicatorPosY, mIndicatorItemLength / 2F, mPaint);
start += itemWidth;
}
}
private void drawHighlights(Canvas c, float indicatorStartX, float indicatorPosY,
int highlightPosition, float progress) {
mPaint.setColor(colorActive);
// width of item indicator including padding
final float itemWidth = mIndicatorItemLength + mIndicatorItemPadding;
if (progress == 0F) {
// no swipe, draw a normal indicator
float highlightStart = indicatorStartX + itemWidth * highlightPosition;
c.drawCircle(highlightStart, indicatorPosY, mIndicatorItemLength / 2F, mPaint);
} else {
float highlightStart = indicatorStartX + itemWidth * highlightPosition;
// calculate partial highlight
float partialLength = mIndicatorItemLength * progress + mIndicatorItemPadding*progress;
c.drawCircle(highlightStart + partialLength, indicatorPosY, mIndicatorItemLength / 2F, mPaint);
}
}
@Override
public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
super.getItemOffsets(outRect, view, parent, state);
outRect.bottom = mIndicatorHeight;
}
}
解决方案
试试这个方法
<android.support.v7.widget.RecyclerView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scrollbars="vertical" />
推荐阅读
- javascript - 声纳中的coverage_exclusions与排除有什么区别?
- perl - 逐行比较两个日志文件并打印差异
- c# - C# Socket 在本地工作,但不能在远程工作
- angular - 从 Angular 中的选择选项更改值
- c# - 编写用于提取 .csv 文件的 C# 代码,如果我给出第一列的一个元素,我将得到其他两列的相应值
- php - 试图获取非对象的属性“”(查看:
- scala - 检查 Scala 类是否是 T 的实例
- octobercms - 魔法形式 | 自定义消息不起作用
- windows - 如何使用 OpenSSL / Curl 检查两侧安全的 https 连接
- blueprism - 蓝色棱镜 - 内部:在“导航菜单”页面上的 WaitStart 阶段“Wait4”中发生 AMI 错误 - 未连接