我的问题非常复杂,我很难找到解决方案来实现以下目标:
我需要有一种传说(步进)布局,其中一个孩子由左栏制成,后面是一个圆圈,后面是一个右栏。像“-o-”那样严厉地说话。因此,一系列儿童看起来像这样:“ - o-o-o-o-o”。当图例聚焦于一个孩子意味着当前孩子就是这个孩子时,这个孩子有一个更大的圆圈和更长的条:“ - O--”。
最终渲染看起来像这样:“ - o-o - O - o-o-”。
每个子项(“ - o - ”)对应于数据库中的特定项。当孩子获得焦点(“ - O--”)时,相关项目将显示在下方。当用户从右向左滑动时,将显示下一个项目,而从左向右滑动将显示上一个项目。
当滑动时,为了显示哪个孩子将显示其相应的项目,请说孩子将被动画显示它具有焦点。我使用Animator
来:
显示图例需要查看之前的内容和下一步的内容。
我相信使用ViewPager
可以帮助我实现以下目标:
getPageWidth()
adapter
方法在屏幕上显示多个页面
醇>
我想到的另一个解决方案是HorizontalScrollView
。
如果我要使用它,根据滑动属性(强度,速度),图例将不确定地滚动而不锚定圆圈。
但使用ViewPager
有一个很大的问题:每个页面都有相同的宽度。但是,图例的锚定孩子需要更大(因此需要更多宽度)。
那么如何动态更改宽度?
除非我可以自定义HorizontalScrollView
以通过滑动拦截来添加锚点效果?
答案 0 :(得分:0)
我认为还有CarouselLayoutManager可能包括你想要的效果。
答案 1 :(得分:0)
如果您使用ViewPager
,我认为最好的方法是使用OnPageChangeListener
。当用户向左/向右滑动时,您将收到回调,以便您可以根据用户滑动的位置调整指示器的大小。
private int mCurrentPage = 0;
viewPager.addOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
// positionOffset goes from 0.0 to just under 1.0 for the leftmost page
float otherOffset = 1.0 - positionOffset;
if (position == mCurrentPage) { // user is incrementing page, i.e. swiping left
// size of current page indicator based on otherOffset
// size of next page indicator based on positionOffset
} else { // user is decrementing page, i.e. swiping right
// size of current page indicator based on positionOffset
// size of previous page indicator based on otherOffset
}
}
@Override
public void onPageSelected(int position) {
mCurrentPage = position;
// ... set final sizes: page @ position = 1.0 all others 0.0
}
});
以下是理解position
和positionOffset
的方法:当网页已确定时,它会居中。假设当前页面位置== 1(即第2页)。
第一种情况:用户向左滑动即可转到下一页。假设用户滑动10%的距离以进入下一页。 position
将为1(最左侧显示),positionOffset
将为0.1
(视口左边缘位于最左侧页面的10%)。因此,当用户滑动时,positionOffset
将从0.0
转到1.0
下方。
第二种情况:用户向右滑动即可转到上一页。当用户向前一页滑动10%的距离时,position
将为0(最左侧显示),positionOffset
将为0.9
(视口左边缘位于最左侧的90%处)页)。因此,当用户滑动时,positionOffset
将从1.0
下方转移到0.0
。
至于指标本身,我做了一个类似的寻呼机指示器,我使用了LinearLayout
水平方向,为每个页面添加了子指示器视图。我使用pagerAdapter.getCount()
来获取要添加的视图数量。
你的指标对于动画来说更复杂,但如果我这样做,我会使用View
ScaleDrawable
.setFields()
背景来制作可能会改变大小的图形。