Android:垂直图像滚动,图像阵列不断变化

时间:2012-09-20 09:47:37

标签: android bitmap scrollview vertical-scrolling scroll-position

我有一个在代码中生成的位图数组(不是从资产,卡片,网页等中获取),并且大约有50个(这个数字不是常数)位图需要在该数组中。起初我尝试一次创建所有位图,这显然导致outOfMemmory错误。因为基于id,图像必须一个接一个地按照确切的顺序创建变量bitmapID,当创建一个位图时,该位图ID会增加,并且只有当需要基于该bitmapID变量在屏幕上显示时才创建图像。

所以第一个解决方案(有效)填充了一个LinearLayout,它位于ScrollView中,带有ImageView。内部活动onCreate()调用方法fillScreen(int how_many_times),它将使用尽可能多的how_many_times所需的图像填充屏幕。在我的演示应用程序中,我将平板电脑屏幕填满了3次。 fillScreen(int how_many_times)正在调用loadBitmap(int bitmapID)的循环,它负责根据给定的id创建单个位图。创建的位图保存在imageHolder对象的数组中。 imageHolder对象除了位图和id之外还有scroll_start和scroll_end参数,指示它们的滚动位置。例如,第一个imageHolder将具有scroll_start = 0和scroll_end = 500,而第二个imageHolder将具有scroll_start = 500和scroll_end = 800.Active具有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是变大还是变小,我都想保持滚动位置不变。有关如何实现这一目标的任何想法?或者关于如何实现这种scrollView的任何其他想法?

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

为了使这个案例和问题更加清晰,请尝试设想赌场老虎机。有一个图像列表,它们始终按顺序排列,但屏幕上只显示一个。并且您可以在两个方向上滚动滚轮,即使您向滚轮添加一些图像或删除一些您在屏幕上看到的图像保持不变。

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

0 个答案:

没有答案