2011-06-26 41 views
0

我有問題,滾動磁盤上相當大的圖像(每個大約1Mb)現在我遇到的問題不是每個圖像之間的延遲,而是加載將圖像的滾動(用於表示變化的圖像)在圖像加載時保持檢測狀態,最終加載時會導致圖像移動。我的問題很簡單。有沒有辦法等到圖像加載(這樣我可以阻止屏幕命令,直到圖像完全加載)。Android等待,直到一個圖像加載到ImageView

感謝您的任何答案!

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(瀏覽量是我的自定義的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)通過inteface調用。

我希望這能給你一個想法!

非常感謝!編號2:

我解決了它!其實更像是我找到了一個方法,但我的作品非常漂亮!

我所做的只是創建一個Timer類,讓我知道什麼時候已經過去了。當我需要加載圖像時,我啓動它(它是另一個線程),並設置一個布爾值,使我的頁面忽略觸摸事件(通過在onTouchEvent中返回false)。當它完成後,它調用我的PVM中的一個函數,將該布爾值再次設置爲true,並且效果正是我想要的。計時器僅等待約500毫秒。

感謝您的幫助!

+0

你能指定使用滾動ImageViews哪個容器? – sparkymat

+0

我實際加載在衍生弗羅馬一個ImageView的成水平的LinearLayout定製containters 3個圖像。當用戶滾動到右側或左側時,我必須加載3個圖像。它工作正常,延遲非常可接受。我只需要忽略觸摸事件,直到完成所有加載。 – aarelovich

回答

0

我希望你使用aSyncTask來加載數據!您可以在加載數據時簡單地添加進度對話框。這可以通過添加來完成:

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

你開始加載數據之前,那麼一旦所有數據已準備就緒只需撥打pDialog.dismiss();

+0

對不起,我已經試過用的AsyncTask的兩種不同的方式,但它只是不工作程序不斷crahing因爲「10月6日至26日:18:42.610:ERROR/AndroidRuntime(24041):android.view.ViewRoot $:致CalledFromWrongThreadException:只有創建視圖層次可以觸摸其觀點原來的線程 「 – aarelovich

+0

發佈您的代碼,我會看看你,如果不是我有一個示例,演示如何設置的AsyncTask鏈接:HTTPS ://docs.google.com/leaf?id=0BwAnjRVwT4WzOWMwYjFhNTctOTUxYy00NjQwLTgwNWEtMmE5MzEyZWQ3NjUx&hl = en_US&authkey = CLnH8_ID – Kenny

0

一(稍長)解決方案,我能想到的是實現自己的ImageView類,它加載一個BitmapDrawable並在onDraw()中繪製它。這樣,您可以確切地知道onDraw()完成時,並調用不同的回調(例如onDrawComplete())來切換觸摸事件處理。

+0

這不會太長,因爲我已經準備好擴展我的ImageView。但是這樣做會使一切都非常緩慢(可以理解,因爲我必須解碼圖像並在每次觸摸屏幕時顯示它)。無論如何,謝謝你這是一個非常好的選擇。 – aarelovich

+0

您可以解碼並保存數據,以便以後重複使用。另外,在新線程中進行。 – sparkymat

+0

但是,如果我在新線程中執行此操作,將會遇到與以前相同的問題。這個問題是因爲s​​etImageBitmap和setImageDrawable在新線程中這樣做。我怎樣才能知道線程何時完成而沒有輪詢? – aarelovich

相關問題