あっという間に電池が無くなる
昨日、作成した動画プログラムですが、動画表示させていると電池の消耗が速いですね。当たり前ですが・・・。
それと面白いことに、SmartWatchへの画像の転送レートを開始してから実際に画像が表示されるのに結構ラグがあること。10fps(100ms毎)で画像を転送すると、20枚程度(2秒間)間が空いて連続画像表示が始まります。SmartWatchエミュレータで表示させるときは、この転送ラグが無いので直ぐに画像表示が始まります。
何故、このラグに気づいたかといいますと、XPERIA本体で音楽を鳴らすようにしたのです。エミュレータでは動画転送開始と共に音楽を再生すれば、タイミングも完璧にあっていたのですが、SmartWatch実機で再生すると、どうしても動画が遅れるのです。そこで、タイミングを調べていたのですが、だいたい2secくらいラグがあることが分かりました。
音楽の再生
とりあえず、改造したソースを下に書いておきます。SoundCommandは自作の音楽再生クラスです。
private class Animation implements Runnable { private final String SDFolder = "/mnt/sdcard/images/BadApple/"; private boolean aniIsStopped = false; private long aniTime1 = 0; private int aniInterval = 100; private int aniCnt1 = 0; private int aniCnt2 = 0; private Bitmap[] aniPicture = new Bitmap[500]; private byte[] aniLoadFlg = new byte[500]; //音楽を鳴らすため private SoundCommand aniSound = new SoundCommand(); Animation(){ //画面を自動消灯しない setScreenState(Control.Intents.SCREEN_STATE_ON); Log.d(SwService.LOG_TAG, "Control.Intents#SCREEN_STATE_ON"); SWDraw.PutText("Now Loading...", 0, 60, 18, Color.WHITE, 0, 0); showBitmap(SWDraw.MainBmp); //動画の準備 AniInit(); //音楽データの読み込みとPlay開始 if(aniSound==null){ aniSound = new SoundCommand(); } if(aniSound.setSoundFile(SDFolder + "BadApple.mp3", true)==true ){ aniSound.setLoop(false); } else{ aniSound = null; } } //************************************************************ // アニメーションの初期化 //************************************************************ private void AniInit(){ //音楽の停止 aniSound.stop(); aiCnt1 = 0; aniCnt2 = 0; //画像の先読み込み String fname = ""; for( int i=0; i<500; i++){ fname = SDFolder + String.format("image%1$04d.bmp", i+1); Log.d(SwService.LOG_TAG, fname); aniPicture[i] = BitmapFactory.decodeFile(fname); aniLoadFlg[i] = 0; } aniTime1 = System.currentTimeMillis(); } //************************************************************ // アニメーションの停止 //************************************************************ public void stop() { //音楽の停止 aniSound.stop(); aniSound = null; aniIsStopped = true; } //************************************************************ // Runnableの実行 //************************************************************ @Override public void run() { if (!aniIsStopped) { if( aniCnt1!=aniCnt2){ if( aniCnt1>0 && aniCnt1<=500 ){ showBitmap(aniPicture[aniCnt1-1]); aniPicture[aniCnt1-1] = BitmapFactory.decodeFile( SDFolder + String.format("image%1$04d.bmp", aniCnt1 + 500) ); aniLoadFlg[aniCnt1-1] = 1; } else if(aniCnt1>500 && aniCnt1<=1000){ if(aniLoadFlg[aniCnt1-501]==1){ showBitmap(aniPicture[aniCnt1-501]); } aniPicture[aniCnt1-501] = BitmapFactory.decodeFile( SDFolder + String.format("image%1$04d.bmp", aniCnt1 + 500) ); aniLoadFlg[aniCnt1-501] = 2; } else if(aniCnt1>1000 && aniCnt1<=1500){ if(aniLoadFlg[aniCnt1-1001]==2){ showBitmap(aniPicture[aniCnt1-1001]); } aniPicture[aniCnt1-1001] = BitmapFactory.decodeFile( SDFolder + String.format("image%1$04d.bmp", aniCnt1 + 500) ); aniLoadFlg[aniCnt1-1001] = 3; } else if(aniCnt1>1500 && aniCnt1<=1690){ if(aniLoadFlg[aniCnt1-1501]==3){ showBitmap(aniPicture[aniCnt1-1501]); } aniPicture[aniCnt1-1501] = BitmapFactory.decodeFile( SDFolder + String.format("image%1$04d.bmp", aniCnt1 + 500) ); aniLoadFlg[aniCnt1-1501] = 4; } else if(aniCnt1>1690 && aniCnt1<=2000){ if(aniLoadFlg[aniCnt1-1501]==3){ showBitmap(aniPicture[aniCnt1-1501]); } } else if(aniCnt1>2000 && aniCnt1<=2190){ if(aniLoadFlg[aniCnt1-2001]==4){ showBitmap(aniPicture[aniCnt1-2001]); } } aniCnt2 = aniCnt1; } aniCnt1 = (int)((System.currentTimeMillis() - aniTime1) / aniInterval); if(aniCnt1>2190){ //リピート再生する SWDraw.PutText("Repat Movie.", 0, 40, 18, Color.WHITE, 0, 0); SWDraw.PutText("Now Loading...", 0, 60, 18, Color.WHITE, 0, 0); showBitmap(SWDraw.MainBmp); //動画の準備 AniInit(); } if(prAllow==2 || prAllow==3){ prAllow = 0; //左スイープor右スイープ SWDraw.PutText("Now Loading...", 0, 60, 18, Color.WHITE, 0, 0); showBitmap(SWDraw.MainBmp); //動画の準備 AniInit(); } //22枚転送した後、音再生開始 if(aniCnt1==22){ if(aniSound!=null){ if(aniSound.isPlaySound()==0){ aniSound.start(); } } } if (mHandler != null) { mHandler.postDelayed(this, 1); } } } }