2011-06-26 8 views
0

かなり大きいディスク(それぞれ約1Mb)で画像をスクロールする問題があります。今の問題は各画像間の待ち時間ではなく、画像は、画像がロードされている間に検出され続ける画像のスクロール(変更を通知するために使用します)が、最後にロードされたときに移動した画像になります。私の質問は簡単です。画像がロードされるまで待機する方法があります(イメージが完全にロードされるまで画面コマンドをブロックすることができます)。画像がImageViewにロードされるまでAndroidが待機する

ありがとうございました!

PD:ところでImageViewでページを読み込んでいます。

EDIT:

投稿AsyincCode:

これは私のテスト活動であるが、

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(); 
     } 
    } 

をitests.java今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); 
} 

このメソッドはintefaceを経由PageViewManager(PVM)によって呼び出されます。

私はこれがあなたにアイデアを与えることを願っています!

ありがとうございました!

EDIT2:

私はそれを解決しました!実際には私はそれの周りの道を見つけたように私は美しく動作します!

私がしたことは、一定の時間が経過したときに私に知らせるTimerクラスを作成することでした。画像をロードする必要があるとき(別のスレッドです)、ブール値を設定して、ページがタッチイベントを無視するようにします(onTouchEventでfalseを返す)。それが完了すると、私のpvmの関数を呼び出して、ブール値をtrueに戻します。その効果は、私が望むものだけです。タイマーは約500ミリ秒しか待機しません。

ありがとうございました!

+0

ImageViewsをスクロールするために使用するコンテナを指定できますか? – sparkymat

+0

実際には、ImageViewから派生したカスタムコンテナに3つの画像を水平のLinearLayoutにロードします。ユーザーが右または左にスクロールすると、3つのイメージをロードする必要があります。それはうまく動作し、待ち時間は非常に許容されます。すべての読み込みが完了するまでタッチイベントを無視するだけです。 – aarelovich

答えて

0

aSyncTaskを使用してデータをロードしてください!データをロードしている間は、単に進捗ダイアログを追加することができます。あなたはデータのロードを開始する前に、その後、すべてのデータの準備ができたら、単にpDialog.dismiss();

+0

申し訳ありませんAsyncTaskを使用する2つの異なる方法を試しましたが、プログラムは "06-26 10: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のを実装することです

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

:これは、追加することによって行うことができますBitmapDrawableをロードしてonDraw()で描画します。このようにして、onDraw()が完了したら確実に知ることができ、タッチイベント処理を切り替えるために別のコールバック(たとえばonDrawComplete()など)を呼び出すことができます。

+0

私はすでにImageViewを拡張していたわけではありませんでした。しかし、これを行うと、すべてが非常に遅くなります(イメージをデコードして、画面に触れるたびにそれを表示する必要があるため、わかります)。とにかくありがとう、本当に良い選択でした。 – aarelovich

+0

後で再利用できるようにデータをデコードして保存することができます。また、新しいスレッドでそれを行います。 – sparkymat

+0

しかし、私が新しいスレッドでそれを行う場合、私は以前と同じ問題を抱えています。この問題は、setImageBitmapとsetImageDrawableが新しいスレッドでそれを行うためです。スレッドがポーリングなしで終了したときは、どうすればわかりますか? – aarelovich

関連する問題