Android等待图像加载到ImageView

时间:2011-06-26 12:16:12

标签: android imageview

我有问题滚动磁盘上相当大的图像(每个大约1 Mb)现在我遇到的问题不是每个图像之间的延迟,而是在加载图像时图像的滚动(我使用它)在加载图像时保持被检测到的信号,在最终加载时导致移动的图像。我的问题很简单。有没有办法等到图像加载(这样我可以阻止屏幕命令,直到图像完全加载)。

感谢您的回答!

PD:顺便说一句,我在ImageView中加载页面;

编辑:

发布AsyincCode:

这是我的测试活动itests.java

public class ImageLoader extends AsyncTask<String, Void, Void > {
    private final ProgressDialog Loading = new ProgressDialog(itests.this);

    protected void onPreExecute(){
        Loading.setMessage("Loading...");
        Loading.show();
    }

    @Override
    protected Void doInBackground(String... params) {
            pvm.setPages(params[0], params[1], params[2]);
        return null;
    }

    protected void onPostExecute(Void... params){
        if (Loading.isShowing()){
            Loading.dismiss();
        }
    }

现在pvm是我的PageViewManager(PageView是我的自定义ImageView,它接收我所有的触摸事件)

这是它的作用:

public void setPages(String left, String center, String right){
    //if (!timer.isAlive()){
        Left = left;
        Center = center;
        Right = right;
        DoublePageMode = true;
        toggleDoublePageMode();
        System.err.println("Waiting...");
        //centerPage.blockCommands();
        //timer.start();
    //}
}

@Override
public void toggleDoublePageMode(){
    if (DoublePageMode){
        //Going into Normal View
        threePageLayout.setOrientation(LinearLayout.HORIZONTAL);
        leftPage.setVisibility(View.VISIBLE);
        LinearLayout.LayoutParams cll = new  LinearLayout.LayoutParams(DWidth,DHeight);
        LinearLayout.LayoutParams zero = new LinearLayout.LayoutParams(0,DHeight);
        centerPage.setImage(Center, DWidth, DHeight, PageState.NORMAL);
        centerPage.setLayoutParams(cll);
        leftPage.setImage(Left, DWidth, DHeight, PageState.NORMAL);
        leftPage.setLayoutParams(zero);
        rightPage.setImage(Right, DWidth, DHeight, PageState.NORMAL);
        rightPage.setLayoutParams(zero);
        DoublePageMode = false;
    }
    else{
        DoublePageMode = true;
        threePageLayout.setOrientation(LinearLayout.VERTICAL);
        leftPage.setVisibility(View.GONE);
        LinearLayout.LayoutParams cll = new LinearLayout.LayoutParams(DWidth,DHeight,1f);
        LinearLayout.LayoutParams zero = new LinearLayout.LayoutParams(DWidth,DHeight,1f);
        centerPage.setImage(Center, DWidth, DHeight, PageState.TWOPAGEMODE);
        centerPage.setLayoutParams(cll);
        rightPage.setImage(Right, DWidth, DHeight, PageState.TWOPAGEMODE);
        rightPage.setLayoutParams(zero);            
    }
}

@Override表示法是因为还必须从LongTouch上的PageView调用该函数。但是我没有做任何长按,所以这不是问题。由于AsyncTask试图移动显示图像的活动的布局,我得到了我告诉你的错误,这很有道理。

当我需要调用此方法时,它来自此代码(在itests.java上):

public void movePages(boolean next) {       
            //Code that initializes left,center,right
            new ImageLoader().execute(left, center, right);
}

此方法由PageViewManager(pvm)通过接口调用。

我希望这会给你一个想法!

非常感谢!

EDIT2:

我已经解决了!实际上更像是我找到了解决方法,但我工作得很漂亮!

我所做的就是创建一个Timer类,让我知道某个时间过去了。当我需要加载图像时,我启动它(它是另一个线程)并设置一个布尔值,使我的页面忽略触摸事件(通过在onTouchEvent中返回false)。当它完成时,它调用我的pvm中的一个函数,它只是将该布尔值再次设置为true,效果就是我想要的。定时器只等待大约500毫秒。

感谢您的帮助!

2 个答案:

答案 0 :(得分:0)

我希望您使用aSyncTask加载数据!您只需在加载数据时添加进度对话框即可。这可以通过添加:

来完成
pDialog = ProgressDialog.show(this, "Loading Data", "Please Wait...", true);

在您开始加载数据之前,一旦您的所有数据准备就绪,只需致电pDialog.dismiss();

答案 1 :(得分:0)

我能想到的一个(冗长的)解决方案是实现自己的ImageView类,它加载一个BitmapDrawable并在onDraw()中绘制它。这样,您可以确定onDraw()何时完成,并调用不同的回调(例如onDrawComplete())来切换触摸事件处理。