セル絵のアニメーション的なやつを実装してみます。
ちょっと入用だったのでどうやって実装するかなーと考えてて、この方法が無難じゃないか的な話ももらったので紹介します。
/// ポイント ///
・Repeaterを使って画像をあらかじめ読み込んでおく
・配置はRowを使って画面の表示エリアを超えて並べておく
・表示するフレームはRowのx座標で調節
・画像が全部ロードできたら上位へのお知らせシグナルも用意(今後のため
補足
・画面をクリックすると再生と停止をトグル
・画像は適当に用意してください
最後のonCompletedで読み込んでます
/// 画像とウインドウの位置関係 ///
こんな感じに配置しておいてタイマーでx座標を移動させればパラパラ漫画になると。
こおやってみるとなんか映画のフィルムみたいな感じ。Columnにしとくべきだったか(笑

ちょっと入用だったのでどうやって実装するかなーと考えてて、この方法が無難じゃないか的な話ももらったので紹介します。
/// ポイント ///
・Repeaterを使って画像をあらかじめ読み込んでおく
・配置はRowを使って画面の表示エリアを超えて並べておく
・表示するフレームはRowのx座標で調節
・画像が全部ロードできたら上位へのお知らせシグナルも用意(今後のため
補足
・画面をクリックすると再生と停止をトグル
・画像は適当に用意してください
最後のonCompletedで読み込んでます
/// 画像とウインドウの位置関係 ///
こんな感じに配置しておいてタイマーでx座標を移動させればパラパラ漫画になると。
こおやってみるとなんか映画のフィルムみたいな感じ。Columnにしとくべきだったか(笑
/// サンプル ///
<Category : Qt>
import QtQuick 1.1
Rectangle {
id: _root
width: 720 * 0.5
height: 1280 * 0.5
property variant path: [] //ファイルのリストを指定する
property int loadedCount: 0 //ロードした枚数を数える
property int pictCount: 0 //画像の枚数
signal loaded() //これで上位に対してお知らせ
//再生
function start(){
if(_timer.running === true){
_timer.restart();
}else{
_timer.start();
}
}
//停止
function stop(){
_timer.stop();
_area.x = 0;
}
onPathChanged: {
//消す
_bootanimation.model.clear();
//内容を登録
loadedCount = 0;
pictCount = path.length;
for(var i=0; i<path.length; i++){
_bootanimation.model.append({"_item": path[i]});
}
}
onLoadedCountChanged: {
if(loadedCount >= pictCount){
//ロード完了
loaded();
}
}
Row{
id: _area
x:0
y:0
//繰り返し配置
Repeater{
id: _bootanimation
model:ListModel{}
画像を繰り返す
Image{
source: _item
width: _root.width
height: _root.height
smooth: true
fillMode: Image.PreserveAspectFit
onStatusChanged: {
//ロード完了したら済みカウントを数える
if(status === Image.Ready){
loadedCount++;
}
}
}
}
}
Timer{
id: _timer
running: false
interval: 33 //大体30fps
repeat: true
onTriggered:{
//位置を調節
if((_area.x - _root.width + _area.width) <= 0){
_area.x = 0;
}else{
_area.x -= _root.width;
}
}
}
Component.onCompleted: {
//画像を登録
var temp = [];
for(var i=0; i<76; i++){
if(i<10){
temp.push("part0/f000" + i + ".jpg");
}else{
temp.push("part0/f00" + i + ".jpg");
}
}
path = temp;
}
MouseArea {
anchors.fill: parent
onClicked: {
//クリックしたら再生と停止
if(_timer.running === true){
_root.stop();
}else{
_root.start();
}
}
}
}


コメント (1)
The genius store called, they're runnnig out of you.
投稿者: Bertin | 2012年04月24日 00:41
日時: 2012年04月24日 00:41