オヌディオプレヌダヌの䟋ずしおのGoogle Waveのガゞェット

はじめに


みなさんこんにちは 今日は、Google Waveのガゞェットの䜜成、途䞭の萜ずし穎、およびそれらを開発する䟿利な方法ガゞェットに぀いお、アクセシブルな方法で話そうずしたす。 HabréのGoogle Waveブログで、waveのガゞェットずロボットの違いはすでに説明されおいたす。 勉匷のためにガゞェットを遞んだ理由は2぀ありたす。

そしお、「䜕を曞くべきか」ずいう質問は自然に萜ちたした。 Wave Previewにアクセスし、利甚可胜な機胜を詊したずき、オヌディオプレヌダヌがなかったこずに腹を立おたした。 なぜ写真を䞀気に投げ入れお、埌で芋るこずができるが、音楜は芋るこずができないのですか 実際、最も可胜性が高い理由は、JavaScript自䜓が音楜の再生方法を認識しおいないため、むンタヌネットで芋぀けたすべおの゜リュヌションがフラッシュプレヌダヌを䜿甚しおいるためです。 Wavesはすでにパフォヌマンスの問題に盎面しおおり、フラッシュはかなりリ゜ヌスを消費するアプリケヌションです。 さらに、考慮する必芁がある䜿いやすさ-たずえば、1぀のメッセヌゞで10人のファむルに10人のプレヌダヌを远加するのではなく、10個のファむルのプレむリストを持぀1人のプレヌダヌを䜜成したす。

基本を理解する


しかし、きれいな歌詞 ブラりザを備えおおり、Google Waveガゞェットの公匏マニュアルを読むためにタバコを吞っおいたす。 Waveのガゞェットは、他のGoogleガゞェットずわずかに異なるこずがわかりたす。Waveず互換性のあるガゞェットは次のこずができたす。

Google向けのガゞェットを䜜成するのは今回が初めおで、ガゞェットの状態を管理する方法に最も興味がありたしたか ぀たり、䞊蚘のリストの最初の機胜です。 「ガゞェットの状態」ずいう衚珟のより単玔な䟋えは、「ガゞェットの蚭定」です。 他の2぀の機胜はすでにより特殊化されおおり、ガゞェットの機胜に倧きく䟝存しおいたす。ガゞェットの状態蚭定を維持するこずはほずんどの堎合必芁です。
たた、ガゞェットは䜜成されたたさにそのWaveに属し、すべおの蚭定はWaveに保存され、ガゞェットをWaveに远加したナヌザヌのレベルではありたせん。 ただし、ガゞェットは垞にそれを远加したナヌザヌを「蚘憶」しおいたす。これは私たちの目的にずっお重芁です。

ガゞェットの構造は非垞に単玔です
  1. <? xml version ="1.0" encoding ="UTF-8" ? > < Module > < ModulePrefs title ="Hello Wave" > < Require feature ="wave-preview" /> </ ModulePrefs > < Content type ="html" > <! [CDATA[ Hello, Wave! ]] > </ Content > </ Module > * This source code was highlighted with Source Code Highlighter .
  2. <? xml version ="1.0" encoding ="UTF-8" ? > < Module > < ModulePrefs title ="Hello Wave" > < Require feature ="wave-preview" /> </ ModulePrefs > < Content type ="html" > <! [CDATA[ Hello, Wave! ]] > </ Content > </ Module > * This source code was highlighted with Source Code Highlighter .
  3. <? xml version ="1.0" encoding ="UTF-8" ? > < Module > < ModulePrefs title ="Hello Wave" > < Require feature ="wave-preview" /> </ ModulePrefs > < Content type ="html" > <! [CDATA[ Hello, Wave! ]] > </ Content > </ Module > * This source code was highlighted with Source Code Highlighter .
  4. <? xml version ="1.0" encoding ="UTF-8" ? > < Module > < ModulePrefs title ="Hello Wave" > < Require feature ="wave-preview" /> </ ModulePrefs > < Content type ="html" > <! [CDATA[ Hello, Wave! ]] > </ Content > </ Module > * This source code was highlighted with Source Code Highlighter .
  5. <? xml version ="1.0" encoding ="UTF-8" ? > < Module > < ModulePrefs title ="Hello Wave" > < Require feature ="wave-preview" /> </ ModulePrefs > < Content type ="html" > <! [CDATA[ Hello, Wave! ]] > </ Content > </ Module > * This source code was highlighted with Source Code Highlighter .
  6. <? xml version ="1.0" encoding ="UTF-8" ? > < Module > < ModulePrefs title ="Hello Wave" > < Require feature ="wave-preview" /> </ ModulePrefs > < Content type ="html" > <! [CDATA[ Hello, Wave! ]] > </ Content > </ Module > * This source code was highlighted with Source Code Highlighter .
  7. <? xml version ="1.0" encoding ="UTF-8" ? > < Module > < ModulePrefs title ="Hello Wave" > < Require feature ="wave-preview" /> </ ModulePrefs > < Content type ="html" > <! [CDATA[ Hello, Wave! ]] > </ Content > </ Module > * This source code was highlighted with Source Code Highlighter .
  8. <? xml version ="1.0" encoding ="UTF-8" ? > < Module > < ModulePrefs title ="Hello Wave" > < Require feature ="wave-preview" /> </ ModulePrefs > < Content type ="html" > <! [CDATA[ Hello, Wave! ]] > </ Content > </ Module > * This source code was highlighted with Source Code Highlighter .
  9. <? xml version ="1.0" encoding ="UTF-8" ? > < Module > < ModulePrefs title ="Hello Wave" > < Require feature ="wave-preview" /> </ ModulePrefs > < Content type ="html" > <! [CDATA[ Hello, Wave! ]] > </ Content > </ Module > * This source code was highlighted with Source Code Highlighter .
  10. <? xml version ="1.0" encoding ="UTF-8" ? > < Module > < ModulePrefs title ="Hello Wave" > < Require feature ="wave-preview" /> </ ModulePrefs > < Content type ="html" > <! [CDATA[ Hello, Wave! ]] > </ Content > </ Module > * This source code was highlighted with Source Code Highlighter .
  11. <? xml version ="1.0" encoding ="UTF-8" ? > < Module > < ModulePrefs title ="Hello Wave" > < Require feature ="wave-preview" /> </ ModulePrefs > < Content type ="html" > <! [CDATA[ Hello, Wave! ]] > </ Content > </ Module > * This source code was highlighted with Source Code Highlighter .
<? xml version ="1.0" encoding ="UTF-8" ? > < Module > < ModulePrefs title ="Hello Wave" > < Require feature ="wave-preview" /> </ ModulePrefs > < Content type ="html" > <! [CDATA[ Hello, Wave! ]] > </ Content > </ Module > * This source code was highlighted with Source Code Highlighter .

構文は非垞に簡単です。
<Module> -このガゞェットがこのXMLファむルに含たれおいるこずを瀺したす。
<ModulePrefs> -ガゞェット、その䜜成者、スクリヌンショットぞのリンク、および車ずパラメヌタヌの小さなカヌトに関する情報を含めるこずができたす。 タむトル、身長、author_emailのみを残したした。
ここで良い䟋を芋るこずができたす。

そしお、ここで私は、それさえ知らずに、cな熊手に出くわしたした。 このコヌドは、ロシアの公匏Googleマニュアルから取られおいたす。 4行目に泚意しおください。
<Require feature = "wave-preview" />

このマニュアル党䜓で、この方法で蚘述する必芁があるこずはどこにでも蚘茉されおいたす。 行自䜓は、ガゞェットがGoogle Wave APIを必芁ずするこずを意味したす。 ただし、このような芁件がある堎合、ガゞェットはFirefoxでのみ機胜したすただOperaに存圚しおいる可胜性があり、テストされおいたせん。
マニュアルでどれだけの量のメモを取り、グヌグルを苊しめたかはわかりたせんが、解決策は1぀の䟋でしか芋぀かりたせんでした。
< Require feature ="wave" />

* This source code was highlighted with Source Code Highlighter .

これは、WebKitブラりザヌがwave APIにアクセスできる唯䞀の方法です。 Firefoxがそれなしでどのように機胜したのだろうか。 ちなみに、boxfrommars habrayuzerが瀺唆しおいるように 、 すべおがマニュアルの英語版で 正しく曞かれおいるので、今のずころはそれに焊点を合わせたほうが良いでしょう。

次に、䜿甚するコンテンツのタむプhtmlたたはurlを指定したす。 URLは、ガゞェットがリモヌトペヌゞをそのフレヌムに単にロヌドするこずを意味したす。 htmlを遞択し、xml-keにすべおを蚘述したす。

<[CDATA [...]]> -すべおのHTML、CSS、およびJavaScriptコヌドたたは察応するファむルぞのリンクを含むガゞェットのメむンコンテンツを含みたす。 このセクションのコンテンツは、通垞のHTMLペヌゞのbodyタグのコンテンツず芋なされる必芁がありたす。
ただ 間違った蚀葉

GoogleガゞェットAPIを理解する


最埌に、プレヌダヌガゞェットの開発を始めたしょう。 私が蚀ったように、javascriptは音楜自䜓を再生する方法を知りたせん、それを助けるためにフラッシュを䞎えたす。 最近、hapodでuppod.ruプロゞェクトに぀いお語られたした。 登録し、プレヌダヌずスタむルを䜜成し、ダりンロヌドしたした-矎 このサむトの良いヘルプは、私にすべおの䞍明瞭な点を明らかにしたした。 そしお、私にずっおただ非垞に興味深いのは、javascriptを介したプレヌダヌ制埡です。 フラッシュドラむブをJavaScriptで制埡するのは論理的ですか 論理的です。 私はすぐにコヌドを投げ、詊しおみたした...
そしお、残念ながら、これは機胜したせん。 なんで 実際、javascriptは1぀のドメむンで実行され、別のドメむンでフラッシュされたす。 セキュリティ蚭定では、Flash Playerを制埡できたせん。 少なくずも私にはうたくいきたせんでした。
次に、最も単玔なオプションを䜿甚したす。プレヌダヌをパヌツに組み立お、蚭定を倉曎するずきに、新しいinnerHTMLを䜿甚しおプレヌダヌでdivを指定したすリロヌドしたす。 ただし、これは通垞、䞀床だけ実行されたす-ガゞェットをblipに远加するずきに、重芁ではないず思いたす。 GETリク゚ストを介しお、぀たりURLで盎接すべおの蚭定を枡すこずもできたす。
ガゞェット甚のWave APIに必芁な機胜を怜蚎しおくださいすべおの機胜は䞊蚘のリンクで説明されおいたす。


ガゞェットを䜜成するずきは、特定のコヌド構造に埓うこずをお勧めしたす-それに埓いたす


その結果、ガゞェットを蚘述するための次の「スケルトン」を取埗したす。
  1. < xml version = "1.0" encoding = "UTF-8"  >
  2. < モゞュヌル >
  3. < ModulePrefs title = "TitleHere" height = "100" author_email = "mail@mail.com" >
  4. < 機胜が 必芁 =「wave」 />
  5. </ ModulePrefs >
  6. < コンテンツ タむプ = "html" >
  7. < [CDATA [
  8. < div id = "content_div" style = "height100px;" > </ div >
  9. < スクリプト タむプ = "text / javascript" >
  10. var div = document .getElementById 'content_div' ;
  11. 関数 stateUpdated{
  12. }
  13. 関数の初期化{
  14. if wave && wave.isInWaveContainer{
  15. wave.setStateCallbackstateUpdated;
  16. }
  17. }
  18. gadgets.util.registerOnLoadHandlerinit;
  19. </ スクリプト >
  20. ]] >
  21. </ コンテンツ >
  22. </ モゞュヌル >
*この゜ヌスコヌドは、 ゜ヌスコヌドハむラむタヌで匷調衚瀺されたした。


プレヌダヌの機胜


プレヌダヌには䜕が必芁ですか はい、プレむしたす 確かに、waveに远加されたファむルから音楜を再生するこずはできたせん。ガゞェットがblipにアクセスできないか、察応するAPIが芋぀かりたせんでした。 したがっお、むンタヌネットの他の郚分からの参照により音楜を再生したす。 さらに、このガゞェットをWaveに远加したナヌザヌのみに蚭定の倉曎を蚱可し、残りは倱うだけです-倱うだけです たあ、ボヌナスずしお、メロディが奜きな人のためにファむルぞのリンクを䞎えるのはいいこずです。
そのため、関数のリスト
  1. むンタヌネットからのリンクを介しお音楜を再生する
  2. 蚭定にアクセスするず、ガゞェットがWaveに远加されるだけです。 必芁に応じお、蚭定を非衚瀺にする必芁がありたす。
  3. プレヌダヌの䞋の盎接ダりンロヌドリンク


蚭定が非衚瀺になるため、もう1぀の機胜を远加したす。ガゞェットは高さを最小に調敎したす。 これを行うには、 <Require feature = "dynamic-height" />をリク゚ストし、ガゞェットの高さが倉わる堎所でgadgets.window.adjustHeightメ゜ッドを䜿甚したす。

コヌドを取埗する


任意の゚ディタヌを䜿甚しお実際のコヌドを曞くこずができたす。私はポむントではなくNetBeansを䜿甚したした。 しかし、䟿利なデバッグのために、 Get DropBoxサヌビスなどに泚意する必芁がありたす。 プロゞェクトをPublic / WavePlayerフォルダヌに配眮し、静かにコヌドを蚘述するか、既存のコヌドをデバッグしたす。 DropBoxは倉曎されたファむルをサヌバヌに自動的にアップロヌドし、waveが曎新されるず、ガゞェットは新しいXML仕様を取埗したすが、それらはキャッシュされたせん。 そこで、プレヌダヌファむルずプレヌダヌのスタむルシヌトを配眮したす。 そこにinstall.xmlをドロップしたしょう-新しい拡匵むンストヌラヌガゞェットぞのリンクを提䟛した仕様登録䞭に自動的に远加されるWaveで芋぀けるこずができ、䟿利なガゞェットを芋぀けるこずができる堎所、ガゞェットをパネルに盎接むンストヌルできたす
このファむルはどのようなものですか
< extension name ="Wave mp3" description ="Play mp3 inside a Wave." >
< version > 0.2 </ version >
< author name ="Author" email ="mail@mail.com" />
< menuHook location ="toolbar" text ="Add Wave mp3 Gadget" iconUrl ="" >
< insertGadget url ="http://dl.dropbox.com/u/983333/WavePlayer_v0.2/WavePlayer.xml" />
</ menuHook >
</ extension >

* This source code was highlighted with Source Code Highlighter .

このxmlは、ガゞェットぞの必芁なリンクず、パネル内のガゞェットのアむコンを単玔に芏定しおいたす。
今、コメントされたコヌドを芋おください、そしお、私は、すべおが適所に萜ちるず思う
<? xml version ="1.0" encoding ="UTF-8" ? >
< Module >
< ModulePrefs title ="WavePlayer" height ="115" author_email ="maksng@gmail.com" >
< Require feature ="wave" />
< Require feature ="dynamic-height" />
</ ModulePrefs >
< Content type ="html" >
<! [CDATA[
< div id ="flash_div" style ="height: 50px;" > Wave player is loading... </ div > <!-- flash -->
< div id ="showlink_div" ></ div > <!-- -->
< div id ="showSettings_div" onClick ="showSettings()" ></ div > <!-- -->

< script type ="text/javascript" >
var flashdiv = document .getElementById( 'flash_div' );

// innerHTML
var player_part_1 = '<object id="waveplayer02" type="application/x-shockwave-flash" data="" width="315" height="50"><param name="allowScriptAccess" value="always" /><param name="wmode" value="transparent" /><param name="movie" value="" /><param name="flashvars" value="comment=Wave Player v0.2&st=http://dl.dropbox.com/u/983333/WavePlayer_v0.2/main.txt&file=' ;
var player_part_2 = '" /></object>' ;
//
var mp3file = 'http://dl.dropbox.com/u/983333/worldapart_.mp3' ;

function buttonChange() { //
if (wave.getViewer() == wave.getHost()) { // , ?
mp3file = document .getElementById( "mp3file" ).value; // input
wave.getState().submitDelta({ 'mp3file' : mp3file}); //
} else { //( )
alert( "Sorry, you are not the owner of this gadget.\n\nOnly the participant who inserted this gadget in the wave (\"the owner\") can change the properties." );
}
}

function buttonHide() { //
wave.getState().submitDelta({ 'hided' : 1}); // ( )
}

function showSettings() { //
wave.getState().submitDelta({ 'hided' : 0}); // ( )
}

function waveStateUpdated() { //callback
if (wave.getState().get( 'mp3file' )) { // mp3file?
mp3file = wave.getState().get( 'mp3file' ); //
}
flashdiv.innerHTML = player_part_1 + mp3file + player_part_2; //
// ,
document .getElementById( "showlink_div" ).innerHTML = "<a href=\"" +mp3file+ "\">Download mp3!</a>" ;

if (wave.getViewer() != wave.getHost()){ // , ?
document .getElementById( "showSettings_div" ).style.display = "none" ; //,
document .getElementById( "settingsDiv" ).style.display = "none" ; //
}
else { //, ,
if (!wave.getState().get( 'hided' )){ // hided()?
document .getElementById( "showSettings_div" ).style.display = "none" ; // -
document .getElementById( "settingsDiv" ).style.display = "" ;
} else { //
var isHided = wave.getState().get( 'hided' ); //
document .getElementById( "showSettings_div" ).style.display = (isHided==1)? "" : "none" ; // -
document .getElementById( "settingsDiv" ).style.display = (isHided==1)? "none" : "" ; // -
}
}
gadgets.window.adjustHeight(); //
}

function init() { //
if (wave && wave.isInWaveContainer()) { //
wave.setStateCallback(waveStateUpdated); // Callback
}
}
gadgets.util.registerOnLoadHandler(init); // init
</ script >
< br >
< div id ="settingsDiv" >
< form name ="mainForm" >
Link to mp3 : < input type ="text" id ="mp3file" value ="" size "40" ></ input >
< input type = button value ="Change mp3!" id ="butChange" onClick ="buttonChange()" >
</ form >< br >
To view it again click on "Show settings!"
< input type = button value ="Hide!" id ="butHide" onClick ="buttonHide()" >
</ div >
]] >
</ Content >
</ Module >


* This source code was highlighted with Source Code Highlighter .

そしお、これが私の劎働の結果です。
画像

䟿利なリンク


  1. Google Waveガゞェットガむド
  2. xmlの良いヘッダヌの䟋
  3. GoogleガゞェットAPI開発者ガむド党般Waveだけでなく
  4. コメント付きおよびなしの゜ヌスの最新バヌゞョン


明らかに、ただ開発するこずがたくさんありたすが、すべおに時間がありたす
コメントでは、可胜な質問に喜んでお答えしたす。
ご枅聎ありがずうございたした 波を最倧限に実行したす

Source: https://habr.com/ru/post/J75656/


All Articles