Photo Gallery

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
naka コメントの体裁とか、コメント速度とか、プレイヤーコントローラー実装とか
色々出来上がってきたので途中経過を撮りました。

パフォーマンスが望ましくないので、手を加える箇所はまだまだありそうです。



動画は chun!! 様の 【MMD】ままま式あぴミクさんでサイバーサンダーサイダー を使わせて頂いてます。



関連記事
開発日誌 - コメント表示型の動画プレイヤー for Android
開発日誌 - コメント表示型の動画プレイヤー for Android (流れるコメントクラスの実装)
開発日誌 - コメント表示型の動画プレイヤー for Android (XMLを‘再生’する為のクラス群)
開発日誌 - コメント表示型の動画プレイヤー for Android (コメント速度の計算)
開発日誌 - コメント表示型の動画プレイヤー for Android (アイコン作成)


スポンサーサイト

Tag:Android 動画 プレイヤー コメント

http://www37.atwiki.jp/commentart/pages/16.html
http://blog.nicovideo.jp/2010/12/post_261.php

nakaコメント11段

if (comment1.vpos + DISP_TIME > comment2.vpos + (DISP_TIME * displayWidth / (displayWidth + commentWidth))) {
// 下段へ
} else {
// 追いつかないので同じ段で
}

Tag:Android 動画 プレイヤー コメント

アイコン


息抜きにアイコン作りました。
もっとセンスが欲しい...



関連記事
開発日誌 - コメント表示型の動画プレイヤー for Android
開発日誌 - コメント表示型の動画プレイヤー for Android (流れるコメントクラスの実装)
開発日誌 - コメント表示型の動画プレイヤー for Android (XMLを‘再生’する為のクラス群)
開発日誌 - コメント表示型の動画プレイヤー for Android (コメント速度の計算)
開発日誌 - コメント表示型の動画プレイヤー for Android (とりあえずそれっぽくなった)


Copyright (C) 2013 potatosub All Rights Reserved.

Tag:Android 動画 プレイヤー コメント アイコン 画像

既存のコメントプレイヤーを何個か見たのですが
コメントの長さによって移動速度を変化させているものばかりでしたので、先人に倣って実装しました。

Android端末によって処理能力が異なる関係で、移動速度を定数として持つことが出来ません。
そこで、画面外でコメントを一定距離走らせてみて、かかった時間を元に移動速度を計算する方法を取ります。

Untitled-1.jpg

コメントを出現させる位置は画像の通りで、画面に表示はされませんが、②を移動させて時間を計ります。
コメントがフレームアウトするのは、④の左端到達時点ですから、表示される移動距離は③+④です。

これで計算に必要な数字は揃ったので、1 フレームで移動する距離を計算させて加速(減速)させます。
長いコメントは速く、短いコメントはゆっくり流れるようになりました。

速さが足りない                   .」
ksk                        .」
こんなコメントも、これで楽しめますね。



かなり完成に近づいてきましたが、今回はここまで。



関連記事
開発日誌 - コメント表示型の動画プレイヤー for Android
開発日誌 - コメント表示型の動画プレイヤー for Android (流れるコメントクラスの実装)
開発日誌 - コメント表示型の動画プレイヤー for Android (XMLを‘再生’する為のクラス群)
開発日誌 - コメント表示型の動画プレイヤー for Android (アイコン作成)
開発日誌 - コメント表示型の動画プレイヤー for Android (とりあえずそれっぽくなった)


Tag:Android 動画 プレイヤー Eclipse コメント java

さくら荘のペットな彼女14話イヴの窓辺とそれぞれの灯り


今週のさくら荘に、天使が映り込んでました。
心臓の弱い方は見ないほうがいいです。



19868.jpg

24030.jpg

20503.jpg

24293.jpg

24691.jpg



引用元:TVアニメ「さくら荘のペットな彼女」
© 鴨志田一/アスキー・メディアワークス/さくら荘製作委員会

Tag:アニメ さくら荘のペットな彼女 青山七海 天使

課題はまだまだ多いですが、とりあえず動画とコメントの再生までは実装できました。

下記は jDOM2 を使って XML ファイルを読み取り、コメントが出現するタイミングでイベント通知を行う為のクラスです。
Activity 側でイベントリスナーをセットして、SurfaceView のコメントを画面上に流します。

コメントファイルはコメントのタイミングをミリ秒単位で記録されていますが、今回このクラスのイベント通知は 1 秒単位に設定してあります。


### XmlReader.java
package com.example.xml;

import java.io.File;
import java.util.Comparator;
import java.util.List;
import java.util.Timer;
import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.input.SAXBuilder;
import android.content.Context;

// コメントファイルリーダー
public class XmlReader implements Runnable {

private String _path;
private List<Element> _comments;
private int _pointer;
private Context _context;
private Timer _timer;
private long _time;
private XmlReadEventListener _listener;
private boolean _isPrepared;
private Thread _thread;
private XmlTask _task;

public XmlReader(Context context, String path) {
_context = context;
_path = path;
_pointer = 0;
_isPrepared = false;
}

// XMLを開く
public void open() {
_thread = new Thread(this);
_thread.start();
}

// XMLを閉じる
public void close() {
_path = null;
_thread = null;
}

// XMLを再生する
public void play() {
_timer = new Timer();
_task = new XmlTask(_comments, _listener);
_task.setTime(_time);
_task.setPointer(_pointer);
_timer.schedule(_task, 0, 1000);
}

// 再生を一時停止する
public void pause() {
_task.cancel();
_pointer = _task.getPointer();
_time = _task.getTime();
_task = null;
_timer = null;
}

// 再生を中断する
public void stop() {
_task.cancel();
_time = 0;
_pointer = 0;
_task = null;
_timer = null;
}

// 再生位置を移動する
public void seekTo(long time) {
pause();
_time = time / 1000;
_pointer = shiftPointer(_pointer, time);
play();
}

// 現在の再生時間を取得する
public long getTime() {
return _task.getTime();
}

// XMLファイルが開かれているか
public boolean isPrepared() {
return _isPrepared;
}

// イベントリスナー登録
public void setXmlReadEventListener(XmlReadEventListener listener) {
_listener = listener;
}

// 再生位置を求める
private int shiftPointer(int point, long targetTime) {
Element comment;
String time;

if (point >= _comments.size()) {
point = _comments.size() - 1;
}

comment = _comments.get(point);
time = comment.getAttribute("vpos").getValue();
int skip = (int)Math.ceil(((double)_comments.size()) / 100);

if (Long.valueOf(time) < targetTime / 10) {
while (_comments.size() - 1 > point && Long.valueOf(time) < targetTime / 10) {
point += skip;
comment = _comments.get(point);
time = comment.getAttribute("vpos").getValue();
}
point += skip;
} else {
do {
point -= skip;
if (point < 0) {
point = 0;
break;
}
comment = _comments.get(point);
time = comment.getAttribute("vpos").getValue();
} while (0 <= point && Long.valueOf(time) > targetTime / 10);
}

return point;
}

@Override
// ファイルオープン処理(スレッド)
public void run() {

Document doc;
Element root;

try {
File file = new File(_path);
if (file.exists()) {
doc = new SAXBuilder().build(file);
root = doc.getRootElement();
root.sortChildren(new XmlComparator());
_comments = root.getChildren("chat");
_isPrepared = true;
if (_listener != null) _listener.onReadCompleted(_context, true, _comments.size());

} else {
_isPrepared = false;
if (_listener != null) _listener.onReadCompleted(_context, false, 0);

}
} catch (Exception e) {
e.printStackTrace();
_isPrepared = false;
if (_listener != null) _listener.onReadCompleted(_context, false, 0);
} finally {
doc = null;
root = null;
}
}

// ソート用クラス
public class XmlComparator implements Comparator<Element> {
public int compare(Element a, Element b) {
if (a.getName().contains("chat") && b.getName().contains("chat")){
return Integer.parseInt(a.getAttribute("vpos").getValue()) - Integer.parseInt(b.getAttribute("vpos").getValue());
} else {
return 0;
}
}
}
}


### XmlTask.java
package com.example.xml;

import java.util.List;
import java.util.TimerTask;
import org.jdom2.Element;
import android.os.Handler;

// リーダーに1秒毎に呼び出されるタスク
public class XmlTask extends TimerTask {

private Handler _handler;
private long _time;
private List<Element> _comments;
private int _pointer;
private XmlReadEventListener _listener;

public XmlTask(List<Element> comments, XmlReadEventListener listener) {
_comments = comments;
_time = 0;
_pointer = 0;
_handler = new Handler();
_listener = listener;
}

// 再生処理(スレッド)
public void run() {

_handler.post(new Runnable() {
@Override
public void run() {
if (_comments.size() > _pointer) {
Element comment;
String time;

while (_listener != null && _comments.size() > _pointer) {
comment = _comments.get(_pointer);
time = comment.getAttribute("vpos").getValue();

if (_time < (Integer.valueOf(time) / 100)) break;
if (_listener != null && (_time - (Integer.valueOf(time) / 100)) <= 1) _listener.onTime(comment.getValue());

_pointer++;
}
_time++;
}
}
});
}

// 現在の再生時間を取得
public long getTime() {
return _time;
}

// 現在の再生時間を設定
public void setTime(long time) {
_time = time;
}

// XML読み込み位置を取得
public int getPointer() {
return _pointer;
}

// XML読み込み位置を設定
public void setPointer(int pointer) {
_pointer = pointer;
}
}


### XmlReadEventListener.java
package com.example.xml;

import java.util.EventListener;
import android.content.Context;
import android.os.Handler;

// イベント通知用クラス
public class XmlReadEventListener implements EventListener {

private Context _context;
private Handler _handler;
private int _commentCount;

public XmlReadEventListener(Context context) {
_context = context;
_handler = new Handler();
}

// XMLファイル読み込み完了通知
public void onReadCompleted(Context context, boolean result, int commentCount) {
_commentCount = commentCount;
}

// コメント表示タイミング通知
public void onTime(String comment) {
}

// ハンドル取得
protected Handler getHandler() {
return _handler;
}

// コンテキスト取得
protected Context getContext() {
return _context;
}

// コメント総数取得
protected int getCommentCount() {
return _commentCount;
}
}


結構なメモリ食いなので、後々軽量化していきます...



関連記事
開発日誌 - コメント表示型の動画プレイヤー for Android
開発日誌 - コメント表示型の動画プレイヤー for Android (流れるコメントクラスの実装)
開発日誌 - コメント表示型の動画プレイヤー for Android (コメント速度の計算)
開発日誌 - コメント表示型の動画プレイヤー for Android (アイコン作成)
開発日誌 - コメント表示型の動画プレイヤー for Android (とりあえずそれっぽくなった)


Tag:Android 動画 プレイヤー Eclipse コメント java jDOM2 XML

新年明けましておめでとうございます。
予定では 2012 年末に滅亡してた筈なんですけどね。おかしいですね。


年末年始は結局ずーっと Android 弄ってます。
業務ソフトWeb 系の経験はあるのですが、ゲームとかその手のコードを触ったことがないので
描画したものを動かすだとか、そういった類に滅法弱いことを痛感しました。

Android では画面上に表示されるコントロールのことを View と言って
元から用意されているテキストボックスだとかボタン等は View の派生クラスになっているようです。
.NET で言うところの System.Windows.Forms.Control のようなものでしょうか。

動画の再生自体は大したことはありません。
Android のパッケージに VideoView というコントロールがあるのでそれを貼り付けて
動画のパスを渡すロジックをちょっと書いただけです。

オブジェクトを動かしたりだとか、端末に高負荷をかけるような処理をする場合は
元々用意されていたコントロールは使わずに、SurfaceView というクラスを使って
Thread を動かしながら、描画ロジックを自分で組む必要があります。


import android.content.Context;
import android.graphics.Canvas;
import android.view.SurfaceView;
import android.view.SurfaceHolder.Callback;
import java.lang.Runnable;

public class TestSurfaceView extends SurfaceView
implements SurfaceHolder.Callback,Runnable {

private Thread _thread;

// コンストラクタ
public TestSurfaceView(Context context) {
super(context);

// コールバック登録
getHolder().addCallback(this);

// 半透明を設定
// getHolder().setFormat(PixelFormat.TRANSLUCENT);

// このViewをトップにする
// setZOrderOnTop(true);

}

@Override
public void surfaceCreated(SurfaceHolder holder) {
// スレッド処理開始
_thread = new Thread(this);
_thread.start();
}

@Override
public void surfaceChanged(SurfaceHolder holder, int format,
int width, int height) {
}

@Override
public void surfaceDestroyed(SurfaceHolder holder) {
// スレッド開放
_thread = null;
}

@Override
public void run() {
while (_thread != null) {
// ホルダーからキャンバスの取得
Canvas canvas = getHolder().lockCanvas();
if (canvas != null) {
try {
// 描画処理
doDraw(canvas);
} finally {
// 描画内容の確定
getHolder().unlockCanvasAndPost(canvas);
}
}
}
// 移動処理
moveProc(canvas);
}

private void doDraw(Canvas canvas) {
// 描画処理
}

private void moveProc(Canvas canvas) {
// 移動処理
}
}


上記のコードは SurfaceView を継承して Thread 処理をする上での基本的な雛形です。
ググったら似たようなコードは沢山見つかると思います。
doDraw メソッド内で描画処理をし、moveProc 内でそれを動かして使います。

これをなんやかんやして、コメントのクラスにしました。
↓が実機でのテスト動画です。




こんだけの為に 1 週間以上かかちゃったよ…(;´o`)
IDEjava もまともに使ったの初めてだし、こんなもんですかね…。

次はコメントの速度とか設定できるようにしまーす。



関連記事
開発日誌 - コメント表示型の動画プレイヤー for Android
開発日誌 - コメント表示型の動画プレイヤー for Android (XMLを‘再生’する為のクラス群)
開発日誌 - コメント表示型の動画プレイヤー for Android (コメント速度の計算)
開発日誌 - コメント表示型の動画プレイヤー for Android (アイコン作成)
開発日誌 - コメント表示型の動画プレイヤー for Android (とりあえずそれっぽくなった)


Tag:Android 動画 プレイヤー Eclipse コメント java SurfaceView



WHAT'S NEW?

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。