前回に引き続き、
ボタン
<!--ボタン-->
<button id="btn" width="${canvas.width}" height="40" fontsize="18" fontstyle="bold">更新
<handler name="onclick">
if(this.text=="更新"){
ds.doRequest(); //(1)
}else{
this.setAttribute('text',"更新"); //(2)
showLeft.doStart(); //(3)
}
</handler>
</button>
画面上部のボタンです。1つの<button>タグで、
「<button>更新</button>」
(1) ds.
(2) this.
(3) showLeft.
アニメーション
<animator id="showLeft" start="false" attribute="x" to="0" duration="300" onstop="parent.setAttribute('align','left');"/>
<animator id="showRight" start="false" attribute="x" to="${-canvas.width}" duration="300" onstop="parent.setAttribute('align','right')"/>
リスト2はアニメーション効果用の<animator>で、
start="false"はアプリの起動時に自動開始しない、
attributeは何を動かすかという設定で、
toは変化後の値です。to="${-canvas.
durationはアニメーションを動作させている時間で、
onstopは<animator>のイベントハンドラで、
左画面(サムネイル画像一覧)
ラッピングレイアウト
<wrappinglayout spacing="0"/>
<wrappinglayout>はコンポーネントを格子状に均等配置するレイアウトタグです。特にiPhoneのように画面が縦長か横長かという変わり方をする場合に便利です。
サムネイル画像
<twitpic_mini datapath="ds:/feed/entry" >
<handler name="ondata">
var tweet = this.datapath.xpathQuery('content/text()'); //(1)
var start = tweet.indexOf("http://twitpic.com/"); //(2)
var url = "http://twitpic.com/show/mini" + tweet.substring(Number(start)+18,Number(start)+25); //(3)
this.setAttribute('src',url); //(4)
</handler>
<handler name="onclick">
showRight.doStart(); //(5)
btn.setAttribute('text',"戻る"); //(6)
rightview.datapath.setFromPointer(this.datapath); //(7)
img.setAttribute('src',this.src); //(8)
</handler>
</twitpic_mini>
<twitpic_
ondataとonclickの2つのイベントハンドラが設定されています。ondataはdatapathからのデータ取得時、
(1)<twitpic_
(2)(3)取り出したツイート文字列からtwitpicのURLだけを抜き出して変数urlに格納しています。
(4)さらにそのurl値を<twitpic_
(5)<animator>のshowRightを開始します。右画面が現れます。
(6)ボタンbtnの文字列を
(7)setFromPointer()はdatapathのメソッドで、
(8)imgのsrc属性に自身のsrc属性値を設定します。
右画面(画像拡大、ツイート)
右画面
<!--右画面(画像拡大、ツイート)-->
<vbox id="rightview" width="${parent.width/2}" datapath="" spacing="2">
・・・
</vbox>
rightviewというidを付けています。幅は親ビュー幅の半分で、
画像表示
<image id="img" align="center" width="${canvas.height/1.7}" height="${this.width}" stretches="both"/>
画像を表示する<image>タグです。画像がブラウザ画面内にうまく表示されるように、
クリックイベントハンドラ
<text datapath="author/name/text()" fontstyle="bold" fgcolor="blue" textdecoration="underline">
<handler name="onclick">
var url = this.datapath.xpathQuery('../uri/text()'); //(1)
lz.Browser.loadURL(url,'_blank'); //(2)
</handler>
この<text>ではdatapathで取得できるアカウント名を文字列として表示します。リンクというのが分かりやすいように青文字および下線を指定しています。
名前をクリックしたらその人のURLを開けられるようにonclickハンドラ内にスクリプトを記述しています。
(1)xpathQuery()で、
(2)lz.
ツイート文字列
<text datapath="content/text()" multiline="true" width="${parent.width}"/>
ツイート文字列です。<text>はデフォルト1行表示なので、
お礼
今回でOpenLaszloの連載を終了します。この連載記事がOpenLaszloでマルチデバイス対応アプリを開発する際のとっかかりとして少しでもお役に立てれば幸いです。ありがとうございました。