0

ビューから拡張するクラスがあります。このクラスの onDraw(Canvas canvas) メソッドで、複数のビットマップをまとめてキャンバスとして表示します。onDraw メソッドが繰り返し実行されると思います。ビットマップの 1 つがコードの SDcard ダウンロード セクションに存在しないかどうかを確認する必要があり、それが継続的にダウンロードされます。私のコードはここにあります:

protected void onDraw(Canvas canvas) 
{
    super.onDraw(canvas);

    canvas.drawARGB(100, 255, 255, 0);
    canvas.translate(posX, posY);
    canvas.scale(imageScale,imageScale);
    int b = 0;
    for (int a = 0 ; a < 5 ;a++)
    {
        for(int i =0 ; i<4 ; i++)
        {
            if(maptile != null){
                canvas.drawBitmap(maptile,(256*i )  ,(256*a) , null);
                downloading  = false;
                b++;
                }else
                {

                    canvas.drawBitmap(toop,(toop.getWidth()*i )  ,(toop.getHeight()*a) , null);
                    Log.i("Canvas loop", "Showing");
                }

        }   
    }
} 

私の問題は、onDraw メソッド中に SDcard を継続的にチェックできないことです。実際、ビットマップがストレージにあるかどうかを確認したいので、表示します。存在しない場合は、その特定のビットマップがダウンロードされるまで、別のビットマップを表示します。この目標を達成するにはどうすればいいですか????

編集: このクラスのコンストラクターから実行されるスレッドを作成します。このスレッドはSDカードをチェックします。特定のファイルがSDカードにダウンロードされるたびに、このファイルをビットマップとして設定します。ビューを再描画して新しいビットマップを表示しようとすると、アプリがクラッシュします。あなたの考えは何ですか? 問題は何ですか??

public class SDChecker  implements Runnable
{

    @Override
    public void run() 
    {
        while( true)
        {
            try {
                Thread.sleep(5000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            File file = new File(Environment.getExternalStorageDirectory()+ "/GreatMap","tile0.jpg");
            if (file.exists())
            {
                maptile= BitmapFactory.decodeFile(Environment.getExternalStorageDirectory()+"/GreatMap/tile0.jpg");
                invalidate();
                Log.i("Create      bit           map", "Bitmap    create");
                Toast.makeText(getContext(), "loadmap tile", Toast.LENGTH_SHORT);
                IMGnotExisting = false;

            }
            else
            {
                IMGnotExisting = true;
            }

        }

    }

}

invalidate() の後、 onDraw() メソッドが呼び出されます。これで、maptile ビットマップができました。今回は、maptile ビットマップを描画する必要があります。しかし、そうではなく、アプリがクラッシュします。

4

1 に答える 1

0

ビューの onDraw メソッドは、invalidate() の呼び出し後にのみ呼び出されます。

ビュー内のビットマップを「デフォルト」のものに初期化し、チェックなしで描画するだけです。次に、ビットマップの準備ができたら、それをビューのビットマップとして設定し (セッターを作成)、view.invalidate() を呼び出します。ビューは新しいビットマップで再描画されます。

リソースを節約するために、古い「デフォルト」ビットマップをリサイクルすることを忘れないでください。

于 2013-09-15T12:09:17.723 に答える