1

我有一组在代码中生成的位图(不是取自资产、卡片、网络等),并且大约有 50 个(这个数字不是常数)位图需要在该数组中。起初我试图一次创建所有位图,这显然导致了 outOfMemory 错误。因为图像必须根据 id 一个接一个地按照精确的顺序排列,所以我创建了变量 bitmapID,当创建一个位图时该变量会增加,并且仅在需要根据该 bitmapID 变量显示在屏幕上时才创建图像。

所以第一个解决方案(有效)是用 ImageView(s)填充 ScrollView 内部的 LinearLayout。内部活动 onCreate() 调用方法 fillScreen(int how_many_times) 它将用图像填充屏幕的次数与变量 how_many_times 预期的一样多。在我的演示应用程序中,我将平板电脑屏幕填满了 3 次。fillScreen(int how_many_times) 正在处理调用 loadBitmap(int bitmapID) 的循环,该循环负责根据给定的 id 创建单个位图。创建的位图保存在 imageHolder 对象的数组中。除了 bitmap 和 id 之外的 imageHolder 对象还有 scroll_start 和 scroll_end 参数来指示它们的滚动位置。例如,第一个 imageHolder 的 scroll_start = 0 和 scroll_end = 500,而第二个 imageHolder 的 scroll_start = 500 和 scroll_end = 800。Activity 实现了 onScrollChanged(scrollView, int x, int y, int oldx, int oldy) 以响应滚动并在屏幕底部添加图像并从顶部删除。所以实现工作就像这样:

if (y > arrayOfImageHolders.get(1).getScroll_end() && removeEnabled) 
{
//removes one image view from beginning of LinearLayout
removeFromBegining();
scrollView.scrollTo(0, arrayOfImageHolders.get(1).getScroll_start());
}

if (y > arrayOfImageHolders.get(arrayOfImageHolders.size() - 1).getScroll_start() && fillEnabled) 
{

//Adds image views at the end of LinearLayout                   
fillScreenEnd(1);

}

有了这个实现,滚动是平滑的,当添加或删除图像时我几乎没有滚动跳跃。在所有 imageHolder 对象上添加或删除图像后,总是会更新 scroll_start 和 scroll_end 值。所以这个实现适用于向前滚动,但我也需要它以相同的方式向后滚动。因此,我添加了如果案例对向后滚动做出反应,并且在我的脑海中它必须像向前滚动一样完美地工作。如果情况向后滚动:

if (y > arrayOfImageHolders.get(arrayOfImageHolders.size() - 1).getScroll_start() && fillEnabled) 
{

//Adds image views at the end of LinearLayout                   
fillScreenEnd(1);

}
else if(y < arrayOfImageHolders.get(1).getScroll_start()) && fillEnabled && y < oldy)
{
//Add image views at the beginning of LinearLayout
fillScreenStart(1);

}

if (y > arrayOfImageHolders.get(1).getScroll_end() && removeEnabled) 
{
//removes one image view from beginning of LinearLayout
removeFromBegining();
scrollView.scrollTo(0, arrayOfImageHolders.get(1).getScroll_start());
}
else if(y < arrayOfImageHolders.get(arrayOfImageHolders.size()-2).getScroll_start() && removeEnabled && y < oldy)
{
//removes one image view from end of LinearLayout
removeFromEnd();

}

我尝试在不同的地方包含 scrollTo() ,但它在任何地方都不起作用。当在开头添加或从结尾删除某些内容时,滚动只会继续移动。无论 scrollView 变大还是变小,我都想保持滚动位置不变。关于如何实现它的任何想法?或者关于如何实现这种滚动视图的任何其他想法?

我还尝试了使用自定义适配器的 ListView 和 onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) 的实现,并尝试通过删除和添加项目并调用 notifyDataSetChange() 来更改 arrayOfImageHolders,但无法获得稳定的屏幕位置删除或添加时。

为了让这个案例和问题更清楚,试着想象一下赌场老虎机。有一个图像列表一直保持有序,但屏幕上只显示一个。而且您可以双向滚动滚轮,即使您在滚轮上添加一些图像或删除一些图像,您在屏幕上看到的图像仍然保持不变。

对我来说,这看起来像是一个复杂的问题,所以任何想法(不仅仅是具体的解决方案)都会受到赞赏。

4

0 回答 0