问题描述
我做的自动水平滚动。所以我有15个项目。现在,我想在12项可访问,所以我的指数为11,但我无法当指数出现滚动它的汽车。
I am doing auto-horizontal scrolling. So i have 15 items. Now i want to access at 12 item so my index is 11. But i am unable to scroll it auto when a index occur.
horizontalScrollView.scrollTo(12, 0);
@Override
public void onPageSelected(int page) {
for(int i = 0; i < holeTitle.length; i++) {
if(i == page) {
title[i].setTextColor(0xffffffff);
horizontalScrollView.scrollTo(12, 0);
}
else {
title[i].setTextColor(0xffe0e0e0);
}
}
}
请专家做一下。
推荐答案
的 .
DmRomantsov's answer is the right way to scroll to the 12th button. However, getLeft()
and getRight()
methods return 0
because the layout is not displayed yet on the screen. It is too early to calculate the width of the layout parent and children. To achieve it, you need to do your auto-scroll inside onWindowFocusChanged
.
@Override
public void onWindowFocusChanged(boolean hasFocus){
super.onWindowFocusChanged(hasFocus);
if(hasFocus){
// do smoothScrollTo(...);
}
}
然而,一个片段里面,这上面的方法是行不通的。我只是写它提供线索,理解这个概念。要在片段相同的行为,你只需要做一个的Runnable
,它可以让时间你的UI显示。然后,做一个的LinearLayout
面向水平:
However, inside a Fragment, this method above will not work. I just wrote it to give a clue, to understand the concept. To have the same behaviour in Fragment, you just need to do a Runnable
which lets the time to your UI to be displayed. Then, do this with a LinearLayout
oriented to horizontal:
// Init variables
HorizontalScrollView mHS;
LinearLayout mLL;
// onCreateView method
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.layout_container, container, false);
// Find your views
mHS = (HorizontalScrollView)view.findViewById(R.id.hscrollview);
mLL = (LinearLayout)view.findViewById(R.id.hscrollview_container);
// Do a Runnable on the inflated view
view.post(new Runnable() {
@Override
public void run() {
Log.v("","Left position of 12th child = "+mLL.getChildAt(11).getLeft());
mHS.smoothScrollTo(mLL.getChildAt(11).getLeft(), 0);
}
});
return view;
}
中东HorizontalScrollView:
您的问题是自动滚动,直到您的孩子12。然而,在下面的评论,你问我自动滚动时的 HorizontalScrollView
,我认为每一个设备上的中间位置。你需要计算屏幕的宽度的,在容器的多少的总宽度的儿童显示设备宽度的内部。下面是一个简单的code:
Your question was to auto-scroll until your 12th child. However, in the comments below, you ask me to auto-scroll at the middle of the HorizontalScrollView
, I assume on every device. You need to calculate the width of the screen, the total width of the container and how many children are displayed inside the device width. Here is a simple code:
// Auto scroll to the middle (regardless of the width screen)
view.post(new Runnable() {
@Override
public void run() {
// Width of the screen
DisplayMetrics metrics = getActivity().getResources()
.getDisplayMetrics();
int widthScreen = metrics.widthPixels;
Log.v("","Width screen total = " + widthScreen);
// Width of the container (LinearLayout)
int widthContainer = mLL.getWidth();
Log.v("","Width container total = " + widthContainer );
// Width of one child (Button)
int widthChild = mLL.getChildAt(0).getWidth();
Log.v("","Width child = " + widthChild);
// Nb children in screen
int nbChildInScreen = widthScreen / widthChild;
Log.v("","Width screen total / Width child = " + nbChildInScreen);
// Width total of the space outside the screen / 2 (= left position)
int positionLeftWidth = (widthContainer
- (widthChild * nbChildInScreen))/2;
Log.v("","Position left to the middle = " + positionLeftWidth);
// Auto scroll to the middle
mHS.smoothScrollTo(positionLeftWidth, 0);
}
});
/**
* Your value might be resumed by:
*
* int positionLeftWidth =
* ( mLL.getWidth() - ( mLL.getChildAt(0).getWidth() *
* ( metrics.widthPixels / mLL.getChildAt(0).getWidth() ) ) ) / 2;
*
**/
中东与HorizontalScrollView选择的值:
我有一点误解真正的请求。其实,你想自动滚动,直到选定的子视图,并显示在屏幕中间的这个观点。结果
然后,我改变了最后一个 INT
positionLeftWidth
现在指的选择的视图相对的左侧位置其父的包含在一个屏幕上的儿童人数的和的选择的视图的半宽度的。因此,code是与上面相同,除了 positionLeftWidth
:
I have a bit misunderstand the real request. Actually, you wanted to auto-scroll until a chosen child view, and display this view at the middle of the screen.
Then, I changed the last int
positionLeftWidth
which refers now to the left position of the chosen view relative to its parent, the number of children contained in one screen, and the half width of the chosen view. So, the code is the same as above, except positionLeftWidth
:
// For example the chosen value is 7
// 7th Child position left
int positionChildAt = mLL.getChildAt(6).getLeft();
// Width total of the auto-scroll (positionLeftWidth)
int positionLeftWidth = positionChildAt - // position 7th child from left less
( ( nbChildInScreen // ( how many child contained in screen
* widthChild ) / 2 ) // multiplied by their width ) divide by 2
+ ( widthChild / 2 ); // plus ( the child view divide by 2 )
// Auto-scroll to the 7th child
mHS.smoothScrollTo(positionLeftWidth, 0);
于是,无论在 getChildAt()
方法,不管宽度屏幕的价值,你将永远有选择的(你的情况)按钮的中间屏幕。
Then, whatever the value in getChildAt()
method, and whatever the width screen, you will always have the chosen (in your case) button at the middle of the screen.
这篇关于自动滚动到HorizontalScrollView的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!