編輯:關於Android編程
今天遇到一個很奇怪的問題,關於在view裡面更新LRC歌詞的,view裡面有一個成員變量,lrcindex ,在draw裡面會用到它來更新歌詞,歌詞裡面有一行是紅色的,表示當前正在播放的歌詞。然後我拖動seekbar同時更新歌詞顯示,我在onProgressChanged裡面更新,其他顏色的歌詞能正常顯示,就是那個紅色的歌詞還是暫停之前那句,沒有更新,怎麼拖都沒用。我打印出了draw裡面那個lrcindex,值沒變 還是暫停之前的值。但是實際上我在另外一個函數根據當前播放時間獲取當前歌詞的時候已經修改了lrcindex,這是怎麼回事?
我做的是一個音樂播放器,動態更新歌詞和進度條的。
給你們看一下我的代碼(只摘取部分關鍵的)
seekBar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() { @Override public void onStopTrackingTouch(SeekBar seekBar) { mp.seekTo(seekBar.getProgress());//mp是播放音樂的服務,這個方法用來設置mediaplayer的進度 } @Override public void onStartTrackingTouch(SeekBar seekBar) { // TODO Auto-generated method stub mp.stopUpdate();//停止自動更新進度條時間和歌詞 } @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { // 這個是一個回調函數,只要seekbar的值改變,系統就會調用這個方法。 System.out.println(220 - lyricView.SelectIndex(seekBar.getProgress()) * (lyricView.getSIZEWORD() + lyricView.getINTERVAL() - 1)); System.out.println(lyricView.SelectIndex(progress) + "--- " + lyricView.getSIZEWORD() + "--" + (lyricView.getINTERVAL() - 1)); lyricView.setOffsetY(220 - lyricView.SelectIndex(progress) * (lyricView.getSIZEWORD() + lyricView.getINTERVAL() - 1)); lyricView.SelectIndex(mp.getplayer().getCurrentPosition()); lyricView.setLrcIndex(lyricView.SelectIndex(progress)); lyricView.invalidate();//更新視圖 } } }); }我每次更新歌詞的進度後,都會調用invalidate來更新視圖,而且控制台也輸出了draw裡面調試信息,lrcindex和我在seekbar值改變監聽器裡面獲取到的就是不一樣。
再來看一下,selectIndex方法
public int SelectIndex(int time) { if (!blLrc) { return 0; } int index = 0; for (int i = 0; i < lrc_map.size(); i++) { LyricObject temp = lrc_map.get(i); if (temp.begintime <= time) { ++index; } } lrcIndex = index - 1; if (lrcIndex < 0) { lrcIndex = 0; } System.out.println("lrcindex-->>" + lrcIndex); return lrcIndex; }我明明更改了,lrcindex的值,但是在draw裡面就是獲取不到它更改後的值。在我松開手之前,lrcindex的值一直是暫停之前的值(我是暫停後拖動seekbar)。松開手後在點播放或者再拖動一下seekbar,它會顯示之前拖動更改後開始打印進度信息。
我在lrcview(顯示歌詞的那個視圖)裡面查找過lrcindex,除了我自己添加的set方法外就只有selectindex方法可以修改lrcindex的值。
後來 我在lrcview.draw裡面不直接用lrcindex這個成員,我在selectindex裡面調用setlrcindex來設置lrcindex,再在draw裡面使用getlrcindex結果就對了,拖動seekbar的時候可以正常顯示所有歌詞,包括那個紅色的當前正在播放的一句。LyricObject temp = lrc_map.get(getLrcIndex());原來的get()裡面的參數是lrcindex。
我學android有一年多了,但是從來沒遇到這個問題,我也不是那種很不通竅的,這次遇到應該不是簡單地問題。感覺好奇怪。。。。
今年剛學了操作系統,當時在Linux環境下創建一個新的進程,新的進程再調用代碼裡面的變量x的時候,x實際上是父進程裡面的x的拷貝,修改子進程裡面的x不會更改父進程裡面的x的值,難道這裡也是這個問題?draw跟我的應用不在一個進程嗎?
下面上一下我的截圖,貌似真是兩個進程在執行draw。。。
大家看得到,我鼠標拖動了,當前的紅色歌詞已經不是我要顯示的歌詞了,正常顯示的應該是在屏幕中間的下方一點。
<喎?/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+PGltZyBzcmM9"/uploadfile/Collfiles/20141218/2014121808480050.png" alt="\">
上圖是我打印的信息,紅色箭頭指向的都是lrcindex的輸出信息,奇怪的是 我在selectindex裡面輸出的"-->>"居然在前後輸出了兩個不同的值,49 28,49是我拖動的時候動態顯示的,表示當前歌詞條數在LRC文件裡面的索引,這個是正確的,而28是我touchseekbar拖動之前的數值。看樣子真是有兩個進程打印lrcindex的值。
即使是兩個進程,那為什麼只有我松開了手,那個lrcindex才會更新呢?雖然學android時間也不短了,但是對android還是有很多不懂得,望大神能解釋一下
三種布局方式android對布局優化提供了三種布局:這三種布局都可以簡化我們的布局文件,優化繪制流程,下面我們簡單看一下這三種組件的使用方式。1、重用布局"ht
先占個位置,過會兒來翻譯,:p DEMO下載地址:http://download.csdn.net/detail/sweetvvck/7728735 Unlike
最近看了很多動畫和一些效果很好的自定義控件,發現了一件事,就是Android的View層設計思想和古老的JavaSwing是如此的相似。這是在原來的基礎上加入了一些輸入移
由於Android幾乎所有的代碼都是公開的,如果要對Framework層分析就必需先拿到Framework層的代碼,我在前面已經搭建好了ubuntu14.04的環境,下載