Re: [android-group-japan: 21959] NativeActivityを使用してシステムフォントを表示したい

1,587 views
Skip to first unread message

Hiroaki GOTO as GORRY

unread,
Feb 12, 2013, 5:52:39 AM2/12/13
to android-g...@googlegroups.com

後藤 浩昭(GORRY)です。

NativeActivityで「C側で作成したウィンドウ」は、Java上で普段使う
ものとは異なる、「OpenGL ESで描画できるだけのウィンドウ」では
ないでしょうか。
このウィンドウ上の画面に文字列を表示したいなら、「文字列を
テクスチャ化してOpenGL ESで描画する」のが一般的な手法です。

「文字列をテクスチャ化する」というのは、文字列を一旦
ビットマップとしてレンダリングしてから、それをテクスチャデータと
して登録することになります。

このような作業を行う場合、NDK側には文字列をレンダリングする
ためのAPIがないため、Java側でCanvas/Bitmapを使って文字列を
レンダリングしてもらう処理を作成し、それをNDK側から呼び出す
ことになります。
Javaで文字列をテクスチャへレンダリングする例は、たとえば
本MLだと[android-group-japan: 20937]のスレッドなどにあります。


In message <137979ba-fc2a-4fc8...@googlegroups.com>
"[android-group-japan: 21959] NativeActivityを使用してシステムフォントを表示したい"
"shinya yamamoto <shiny...@gmail.com>" wrote:

> 初めて投稿させていただきます。
> Android初心者のyamamotoです。
>
> android-ndk r8bを使用してandroidを勉強しています。
>
>
> 【希望動作】
> android-ndk/samples/native-activityのサンプルにて、システムフォントを使用し画面に文字表示を行う
>
>
> 【現状説明】
> CからJavaコードを呼び出し、setTextを使用して表示を試みているのですが、期待通りに表示されません。
>
> NativeActivityを使用せず、java側でGLSurfaceViewを作成すれば、希望動作が出来ることは確認しております。
> C側で作成したウィンドウをaddViewする方法がわかれば解決になるのかと個人的には思っているのですが・・・。
>
>
> 上記サンプル内の、engine_init_displayの終了後に、下記javaコードのCreateTextViewを呼び出しています。
>
> よろしくお願いします。
>
> //---------------------------------------------------------------------------------------------------
> // javaコード ※import類は割愛させていただきます
> public class Test extends NativeActivity
> {
> static {
> System.loadLibrary("native-activity");
> }
>
> private static Handler mHandler;
> private TextView mtv;
>
> @Override
> public void onCreate(Bundle savedInstanceState)
> {
> super.onCreate(savedInstanceState);
>
> mHandler = new Handler();
>
> mLayout = new LinearLayout(this);
> mLayout.setOrientation(LinearLayout.VERTICAL);
> setContentView(mLayout);
> }
>
> public void CreateTextView()
> {
> mHandler.post( new Runnable() {
> @Override
> public void run() {
> mtv = new TextView(getApplicationContext());
> mtv.setText("Hello World!!");
> mLayout.addView(mtv);
> return;
> }
> });
> }
> }
>
> --
> このメールは Google グループのグループ「日本Androidの会」の登録者に送られています。
> このグループから退会し、メールの受信を停止するには、android-group-j...@googlegroups.com にメールを送信します。
> このグループに投稿するには、android-g...@googlegroups.com にメールを送信してください。
> http://groups.google.com/group/android-group-japan?hl=ja からこのグループにアクセスしてください。
> その他のオプションについては、https://groups.google.com/groups/opt_out にアクセスしてください。
>
>



--
Hiroaki GOTO as "GORRY" : 後藤 浩昭
EMAIL: gorr...@gmail.com

やましん

unread,
Feb 12, 2013, 9:19:45 AM2/12/13
to android-g...@googlegroups.com
ご回答ありがとうございます。
教えていただいたスレッドを参考に、TextView->Bitmap->NDK側で描画して文字表示は出来ました。


追加で質問となってしまうのですが、
文字列をテクスチャ化してOpenGL ESで描画する方法しかないのでしょうか?


例えば、毎フレーム文字列が変わるFPS表示といった場合、処理負荷が高く
TextViewの内容をテクスチャ化などせずに、そのまま画面に出せたりしないものかと・・・。

自分であらかじめリソースを作成しておき、文字判定とかも考えたんですが、
javaの機能で存在するので、ソレをそのまま使えるのが一番良いと考えてます。




2013年2月12日火曜日 19時52分39秒 UTC+9 GORRY:

後藤 浩昭(GORRY)です。

NativeActivityで「C側で作成したウィンドウ」は、Java上で普段使う
ものとは異なる、「OpenGL ESで描画できるだけのウィンドウ」では
ないでしょうか。
このウィンドウ上の画面に文字列を表示したいなら、「文字列を
テクスチャ化してOpenGL ESで描画する」のが一般的な手法です。

「文字列をテクスチャ化する」というのは、文字列を一旦
ビットマップとしてレンダリングしてから、それをテクスチャデータと
して登録することになります。

このような作業を行う場合、NDK側には文字列をレンダリングする
ためのAPIがないため、Java側でCanvas/Bitmapを使って文字列を
レンダリングしてもらう処理を作成し、それをNDK側から呼び出す
ことになります。
Javaで文字列をテクスチャへレンダリングする例は、たとえば
本MLだと[android-group-japan: 20937]のスレッドなどにあります。


> このグループから退会し、メールの受信を停止するには、android-group-japan+unsubscribe@googlegroups.com にメールを送信します。
> このグループに投稿するには、android-group-ja...@googlegroups.com にメールを送信してください。

田代透

unread,
Feb 12, 2013, 10:20:43 AM2/12/13
to android-g...@googlegroups.com
NativeActivityの初期化の段階で、必要なテクスチャデーターをJavaに依頼して取得し、
再度取得すること無くCでそのテクスチャデータを表示すれば良いことじゃないでしょうか。

また、フリーのFontであればそのテクスチャデータを必要なフォントサイズで
イメージデータしてアプリが持っておくということも可能だと思います。
(他の表示とのイメージの共通化と考えれば端末のデフォルトのフォントイメージを使うのが良策でしょうが)



2013年2月12日 23:19 やましん <shiny...@gmail.com>:
このグループから退会し、メールの受信を停止するには、android-group-j...@googlegroups.com にメールを送信します。
このグループに投稿するには、android-g...@googlegroups.com にメールを送信してください。

http://groups.google.com/group/android-group-japan?hl=ja からこのグループにアクセスしてください。
その他のオプションについては、https://groups.google.com/groups/opt_out にアクセスしてください。
 
 



--
--
Toru Tashiro
toru...@gmail.com

kacodama

unread,
Feb 12, 2013, 7:45:52 PM2/12/13
to android-g...@googlegroups.com
ゲームとかでよくやるのは、数字やアルファベットだけなら、一枚の画像に文字を全部描いておいて、
それらをテクスチャ座標で区切って板ポリに貼り付けて表示したりします。
テクスチャ座標系の計算やデータが必要になりますが、面倒なので私は等幅フォントにしたりしちゃいます。

システムフォントでも、同じように、初期化処理で一度だけ内部でそのように
「文字だけ描画した」画像を作成しておけば、後はそれを使いまわせばいいだけですね。

ていうか、Androidなら作ったその画像を保存もしておけば、本当に初回起動だけ
文字テクスチャを作ればいいような気がします。

ひらがな、カタカナまでは同じような手法で出来るかと思います。
漢字が入ってくるとなかなかいっぺんに作っておくというのは難しいでしょうね。
ユーザーが任意の文字を入力できるわけではないのであれば、使う漢字を
限定して画像を用意しておくのが簡単でしょうね。

機種によってはメモリがネックですが・・・

2013年2月13日水曜日 0時20分43秒 UTC+9 Toru:
In message <137979ba-fc2a-4fc8-8bc5-849522a2...@googlegroups.com>
  "[android-group-japan: 21959] NativeActivityを使用してシステムフォントを表示したい"
> このグループに投稿するには、android-group-jap...@googlegroups.com にメールを送信してください。
> http://groups.google.com/group/android-group-japan?hl=ja からこのグループにアクセスしてください。
> その他のオプションについては、https://groups.google.com/groups/opt_out にアクセスしてください。
>
>



--
Hiroaki GOTO as "GORRY" : 後藤 浩昭

--
このメールは Google グループのグループ「日本Androidの会」の登録者に送られています。
このグループから退会し、メールの受信を停止するには、android-group-japan+unsubscribe@googlegroups.com にメールを送信します。
このグループに投稿するには、android-group-ja...@googlegroups.com にメールを送信してください。
http://groups.google.com/group/android-group-japan?hl=ja からこのグループにアクセスしてください。
その他のオプションについては、https://groups.google.com/groups/opt_out にアクセスしてください。
 
 



--
--
Toru Tashiro
toru...@gmail.com

やましん

unread,
Feb 13, 2013, 12:10:47 AM2/13/13
to android-g...@googlegroups.com
つまりC側で描画するしかないってことですね。

文字判定をjava側であるのにC側でも作らないといけないと考えているので
java側で表示する方法があればなーと考えてたんですが・・・。

おとなしくそちらの方面で作業を進めてみます。
ありがとうございました。


2013年2月13日水曜日 0時20分43秒 UTC+9 Toru:
In message <137979ba-fc2a-4fc8-8bc5-849522a2...@googlegroups.com>
  "[android-group-japan: 21959] NativeActivityを使用してシステムフォントを表示したい"
> このグループに投稿するには、android-group-jap...@googlegroups.com にメールを送信してください。
> http://groups.google.com/group/android-group-japan?hl=ja からこのグループにアクセスしてください。
> その他のオプションについては、https://groups.google.com/groups/opt_out にアクセスしてください。
>
>



--
Hiroaki GOTO as "GORRY" : 後藤 浩昭

--
このメールは Google グループのグループ「日本Androidの会」の登録者に送られています。
このグループから退会し、メールの受信を停止するには、android-group-japan+unsubscribe@googlegroups.com にメールを送信します。
このグループに投稿するには、android-group-ja...@googlegroups.com にメールを送信してください。
http://groups.google.com/group/android-group-japan?hl=ja からこのグループにアクセスしてください。
その他のオプションについては、https://groups.google.com/groups/opt_out にアクセスしてください。
 
 



--
--
Toru Tashiro
toru...@gmail.com

やましん

unread,
Feb 13, 2013, 12:14:04 AM2/13/13
to android-g...@googlegroups.com
固定文字だけであれば、メモリ問題さえクリアすればその手法で行こうと僕も考えていました。

ただ、毎フレーム表示内容が変わるようなもの(例:速度表示など)の場合
C側で文字判定したりUV値計算したりと色々しなくちゃいけなく、TextViewでそのまま表示できれば良いのになーと考えていました。

おとなしくC側で判定処理を作成して作業を進めてみます。
ありがとうございました。


2013年2月13日水曜日 9時45分52秒 UTC+9 kacodama:
Reply all
Reply to author
Forward
0 new messages