当我在布局之间滚动时,需要太长时间才能在画廊的图片之间滚动。有没有办法减少这个时间?

时间:2011-01-09 10:12:22

标签: dynamic android-layout gallery scrollview

这是我的第一个问题,虽然我已经阅读了这个论坛很长一段时间了。我怀疑的大部分答案都来自这里:)

回到主题。我正在开发一个Android应用程序。我正在绘制一个动态布局,基本上是Galleries,在LinearLayout内部,在ScrollView内部,在RelativeLayout内部。 ScrollView是必须的,因为我正在绘制大量可能不适合屏幕的动态画廊。

当我在布局中滚动时,我必须等待3/4秒,直到ScrollView“停用”才能在画廊内滚动。我想要做的是将这个时间减少到最低限度。我希望能够在我从屏幕上抬起手指后立即在画廊内滚动,但是低于2秒的任何东西也会很好。

我正在谷歌搜索解决方案,但直到现在我找到的所有布局教程都没有解决这个问题。我希望有人在这里知道这是否可能,如果有的话,给我一些关于如何做的提示。

我不想做自己的ScrollView来解决这个问题。但如果这是唯一可以获得帮助的方式,因为我不确定如何解决这个问题。

这是我的布局:

public class PicturesL extends Activity implements OnClickListener,
    OnItemClickListener, OnItemLongClickListener {


private ArrayList<ImageView> imageView = new ArrayList<ImageView>();

private StringBuilder PicsDate = new StringBuilder();

private CaWaApplication application;
private long ListID;

private ArrayList<Gallery> gallery = new ArrayList<Gallery>();
private ArrayList<Bitmap> Thumbails = new ArrayList<Bitmap>();
private String idioma;

private ArrayList<Long> Days = new ArrayList<Long>();
private long oldDay;
private long oldThumbsLoaded;
private ArrayList<Long> ThumbailsDays = new ArrayList<Long>();
private ArrayList<ArrayList<Long>> IDs = new ArrayList<ArrayList<Long>>();

@Override
public void onCreate(Bundle savedInstancedState) {
    super.onCreate(savedInstancedState);
    RelativeLayout layout = new RelativeLayout(this);
    ScrollView scroll = new ScrollView(this);
    LinearLayout realLayout = new LinearLayout(this);
    ArrayList<TextView> texts = new ArrayList<TextView>();



    Button TakePic = new Button(this);
    idioma = com.mateloft.cawa.prefs.getLang(this);
    if (idioma.equals("en")) {
        TakePic.setText("Take Picture");
    } else if (idioma.equals("es")) {
        TakePic.setText("Sacar Foto");
    }


    RelativeLayout.LayoutParams scrollLP =  new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.FILL_PARENT,
            RelativeLayout.LayoutParams.FILL_PARENT);

    layout.addView(scroll, scrollLP);

    realLayout.setOrientation(LinearLayout.VERTICAL);
    realLayout.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT,
            LayoutParams.FILL_PARENT));


    scroll.addView(realLayout);



    TakePic.setId(67);
    TakePic.setOnClickListener(this);
    application = (CaWaApplication) getApplication();

    ListID = getIntent().getExtras().getLong("listid");
    getAllThumbailsOfID();


    LinearLayout.LayoutParams TakeLP = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, 
            LinearLayout.LayoutParams.WRAP_CONTENT);



    realLayout.addView(TakePic);
    oldThumbsLoaded = 0;

    int galler = 100;

    for (int z = 0; z < Days.size(); z++) {


        ThumbailsManager croppedThumbs = new ThumbailsManager(Thumbails,
                oldThumbsLoaded, 
                ThumbailsDays.get(z));
        oldThumbsLoaded = ThumbailsDays.get(z);

        texts.add(new TextView(this));
        texts.get(z).setText("Day " + Days.get(z).toString());
        gallery.add(new Gallery(this));
        gallery.get(z).setAdapter(new ImageAdapter(this, croppedThumbs.getGallery(), 250, 175, true,
                ListID));
        gallery.get(z).setOnItemClickListener(this);
        gallery.get(z).setOnItemLongClickListener(this);
        gallery.get(z).setId(galler);
        galler++;

        realLayout.addView(texts.get(z));
        realLayout.addView(gallery.get(z));
    }


    Log.d("PicturesL", "ListID: " + ListID);





    setContentView(layout);
}

private void getAllThumbailsOfID() {

    ArrayList<ModelPics> Pictures = new ArrayList<ModelPics>();

    ArrayList<String> ThumbailsPath = new ArrayList<String>();

    Pictures = application.dataManager.selectAllPics();
    long thumbpathloaded = 0;
    int currentID = 0;
    for (int x = 0; x < Pictures.size(); x++) {

        if (Pictures.get(x).walkname == ListID) {

            if (Days.size() == 0) { Days.add(Pictures.get(x).day); oldDay = Pictures.get(x).day; 
            IDs.add(new ArrayList<Long>()); currentID = 0; }

            if (oldDay != Pictures.get(x).day) {
                oldDay = Pictures.get(x).day;
                ThumbailsDays.add(thumbpathloaded);
                Days.add(Pictures.get(x).day);
                IDs.add(new ArrayList<Long>());
                currentID++;




            }


            StringBuilder tpath = new StringBuilder();
            tpath.append(Pictures.get(x).path.substring(0,
                    Pictures.get(x).path.length() - 4));
            tpath.append("-t.jpg");
            IDs.get(currentID).add(Pictures.get(x).id);
            ThumbailsPath.add(tpath.toString());

            thumbpathloaded++;

            if (x == Pictures.size() - 1) {
                Log.d("PicturesL", "El ultimo de los arrays, tamaño: " + Days.size());
                ThumbailsDays.add(thumbpathloaded);


            }
        }

    }

    for (int y = 0; y < ThumbailsPath.size(); y++) {
        Thumbails.add(BitmapFactory.decodeFile(ThumbailsPath.get(y)));

    }

}

当屏幕方向发生变化导致速度变慢时,我在另一个活动上发生了内存泄漏,现在效果更好了。卷轴未锁定。但有时,当它停止滚动时,需要几秒钟(2/3)来禁用它自己。我只是希望它有点动态,有没有办法覆盖监听器并让它停止滚动ON_ACTION_UP或类似的东西?

我不想使用listview,因为我希望每个图库都被其他视图分隔,现在我只有文本,但我可能会将它们与不同于图库的图像分开。

我不确定这是否可以使用listadapter和listview,我假设一个视图只能处理一种类型的对象,所以我正在使用布局的滚动视图,如果我错了请纠正我:)

此活动也可用作预览或选择要以完整尺寸查看的图片并管理其值。所以它只能用缩略图工作。每个重量为40 kb。猜测用户在这个视图中获取超过1000~1500张图片是不太可能的,我认为在这种情况下活动不会使用超过40~50 mb的ram,如果我打开全尺寸视图则增加10个。所以我猜想大多数设备都能够以完整尺寸显示这个视图。如果它在低端设备上不起作用,我的计划是在应用程序首选项中添加一个选项,让用户根据某些数据库值切断此视图。

最后一个原因是,在此活动的大部分时间“生命周期”(应用程序具有与视图相关的图片,当它结束时,选择显示哪些图片的值必须更改,并且不再有图片在此活动的这个实例中添加了);视图将无人居住,所以大部分时间都显示一切都不会花费太多,只是在周期结束时

这或多或少是我创建此布局时的想法。我对任何建议或观点持开放态度,我刚刚在几天前创建了这个布局,我正在努力查看它是否能正常工作,因为它适合我的应用程序需求。虽然如果有更好的方式我会喜欢听到它

PD:我一直在想看看它能吸引多少。我设法在相同的布局上绘制了530个带有600个缩略图的画廊,应用程序使用了42 mb,然后我无法访问更多内存来启动我的全尺寸视图:(。我尝试用1000做同样的事情但是它会抛出OutOfMemory错误,位图大小超过vm预算。有没有办法在高端设备上提供更多可用的内存?或者我应该尝试找出一种不同时绘制所有内容的方法?listview是否适用于多个对象的类型?

由于

圣马特奥

1 个答案:

答案 0 :(得分:0)

为什么不让你的画廊列出一个列表视图?这样你就不必立即给它们充气,并且可以利用listview重新计算机制。您看到的一些缓慢可能来自非常繁重的内存使用。画廊并不是简单的小部件,因此一旦停止滚动,您可能会看到来自重度GC活动的暂停。带有适配器的ListView还允许您将Galleries懒惰地绑定到列表中,这样在投掷过程中您就不会对画廊进行昂贵的绑定。