好吧,因为我之前问过的 this question,我发现你无法知道 WebView 的滚动位置。我按照建议将我的内容放在 ListView 中。现在有一个新问题。
我想做的就是告诉 View 的某个部分何时滚动超过屏幕的底部边缘和顶部边缘。当图像出现在屏幕底部或消失在屏幕顶部时,我想播放一个音效。
这是我使用 ListView 的代码。问题是没有一致地调用 onScroll。似乎只有当我抬起手指等待,然后再次开始滚动时它才会被调用。
同时,onScrollStateChanged 也不总是被调用——它似乎只在滚动的第一帧被调用。
有没有什么方法可以连续获取滚动的每一帧的滚动信息,而不管我是否正在触摸屏幕?我只想知道滚动动画是否已被激活,即使它是一个像素,这样我就可以查看图像元素的位置并查看它是否在屏幕上。
public class Scroll extends ListActivity implements ListView.OnScrollListener {
public ListView listview;
public int firstItemOnScreen;
public int lastItemOnScreen;
public int previousFirstItemOnScreen;
public int previousLastItemOnScreen;
private TextView mStatus;
private boolean mBusy = false;
//
// Will not bind views while the list is scrolling
//
//
private class SlowAdapter extends BaseAdapter {
private LayoutInflater mInflater;
public SlowAdapter(Context context) {
mContext = context;
mInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
//
// The number of items in the list is determined by the number of speeches
// in our array.
//
// @see android.widget.ListAdapter#getCount()
//
public int getCount() {
return 0;//mStrings.length;
}
//
// Since the data comes from an array, just returning the index is
// sufficent to get at the data. If we were using a more complex data
// structure, we would return whatever object represents one row in the
// list.
//
// @see android.widget.ListAdapter#getItem(int)
//
public Object getItem(int position) {
return position;
}
//
// Use the array index as a unique id.
//
// @see android.widget.ListAdapter#getItemId(int)
//
public long getItemId(int position) {
return position;
}
//
// Make a view to hold each row.
//
// @see android.widget.ListAdapter#getView(int, android.view.View,
// android.view.ViewGroup)
//
public View getView(int position, View convertView, ViewGroup parent) {
TextView text;
if (convertView == null) {
text = (TextView)mInflater.inflate(android.R.layout.simple_list_item_1, parent, false);
} else {
text = (TextView)convertView;
}
if (!mBusy) {
//text.setText(mStrings[position]);
// Null tag means the view has the correct data
text.setTag(null);
} else {
text.setText("Loading...");
// Non-null tag means the view still needs to load its data
text.setTag(this);
}
return text;
}
//
//Remember our context so we can use it when constructing views.
//
private Context mContext;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ImageListAdapter ila = new ImageListAdapter(this);
// Add four items
ila.addItem(new ImageList(
"", getResources().getDrawable(R.drawable.header)));
ila.addItem(new ImageList(
"Test text", null));
ila.addItem(new ImageList(
"", getResources().getDrawable(R.drawable.interstitial1)));
ila.addItem(new ImageList(
"Test text", null));
// Display it
setListAdapter(ila);
getListView().setOnScrollListener(this);
}
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount,
int totalItemCount){
firstItemOnScreen = getListView().getFirstVisiblePosition();
lastItemOnScreen = getListView().getLastVisiblePosition();
Log.v("List", "first:" + firstItemOnScreen);
Log.v("List", "last:" + lastItemOnScreen);
// Bottom edge appears at top of screen
if (firstItemOnScreen == 2 && previousFirstItemOnScreen != 2) {
tvt.playEffect(2, 0);
}
// Top edge appears at top of screen
// AND
// Bottom edge appears at bottom of screen
if (firstItemOnScreen == 1 && lastItemOnScreen == 3) {
if (lastItemOnScreen != previousLastItemOnScreen || firstItemOnScreen != previousFirstItemOnScreen)
tvt.playEffect(2, 0);
}
// Top edge appears at bottom of screen
if (lastItemOnScreen == 2 && previousLastItemOnScreen != 2) {
tvt.playEffect(2, 0);
}
if (firstItemOnScreen == 3 && previousFirstItemOnScreen == 2)
tvt.playEffect(2, 0);
if (previousLastItemOnScreen == 3 && lastItemOnScreen == 2)
tvt.playEffect(2, 0);
if (previousFirstItemOnScreen == 1 && firstItemOnScreen == 2 && previousLastItemOnScreen == 3 && lastItemOnScreen == 3)
tvt.playEffect(2, 0);
if (firstItemOnScreen == 1 && previousFirstItemOnScreen == 1) {
if (lastItemOnScreen ==1 && previousLastItemOnScreen == 2)
tvt.playEffect(2, 0);
}
previousFirstItemOnScreen = firstItemOnScreen;
previousLastItemOnScreen = lastItemOnScreen;
}
public void onScrollStateChanged(AbsListView view, int scrollState) {
switch (scrollState) {
case OnScrollListener.SCROLL_STATE_IDLE:
mBusy = false;
int count = view.getChildCount();
for (int i=0; i<count; i++) {
ImageListView t = (ImageListView)view.getChildAt(i);
if (t.getTag() != null) {
t.setTag(null);
}
}
break;
case OnScrollListener.SCROLL_STATE_TOUCH_SCROLL:
mBusy = true;
break;
case OnScrollListener.SCROLL_STATE_FLING:
mBusy = true;
break;
}
}
最佳答案
这个答案来晚了,但是在 Android 中实现滚动的方式我认为你可能需要子类化 ListView 来做你想做的事。您可以覆盖 scrollTo 和 scrollBy 并在那里检查您的条件(确保在适当的时间调用 super.scrollTo 和 super.scrollBy)。
关于Android:更多滚动问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2611434/