onDrawFrame メソッドで、Renderer を実装するクラスの各フレームで変化する右上隅のテクスチャなしで単純な白いテキストを表示する簡単な方法はありますか? 2Dなので変形する必要はないと思います。多くのチュートリアルを見つけましたが、どれもコードが多すぎて複雑すぎるようです。たぶん、数行のコードで実行できますか? それが不可能な場合、既存のコードをあまり変更せずに行う最も簡単な方法は何ですか? 私は初心者なので、完全なコードを示してください。
8 に答える
Renderer は OpenGL メソッドです。OpenGL ES は本質的にテキストをサポートしていません。これにより、次のオプションが残ります。
- テクスチャを使用し、Android の Canvas クラスを使用して描画します。
- ライブラリを使用します。これはおそらくテクスチャにも描画されます。
- ポリゴンでテキストを作成します。
あなたの質問はテクスチャに描画されない解決策を求めているので、1 と 2 は両方ともアウトです。そして、シンプルなものが欲しいので、3もアウトです。良い解決策を残しません。
考慮すべき別の方法は、使用している GLSurfaceView の上に別のビューを重ねることです。RelativeLayout を使用すると、2 つのビューを簡単にスタックできます。1 つは、画面の右上隅に固定できるテキストビューです。以下の疑似コード:
<RelativeLayout ... />
<GLSurfaceView ... />
<TextView ... />
</RelativeLayout>
このアプローチには、OpenGL 要件から抜け出してテキストを作成できるという利点があります。いくつかのアプリでこれを成功させました。
Android SDK サンプルに付属している API Demos プロジェクトを参照してください。まさにあなたが望むことを行う OpenGL Sprite Text サンプルがあります。
エミュレーター (またはデバイス) に API Demos をインストールし、[API Demos] > [Graphics] > [OpenGL ES] > [Sprite Text] に移動して、デモを表示できます。
スクリーンショットは次のとおりです。
画面右下のテキストは、Renderer の onDrawFrame メソッドでフレームごとに変更されます。
ソース コードは、Android SDK のサンプル ディレクトリ ( ApiDemos\src\com\example\android\apis\graphics\spritetext) にあります。
プロジェクトにいくつかのファイルをコピーする必要があり、ごくわずかなコード行で同じ機能を実現できます。
サンプル アプリケーション: API Demos プロジェクトのコードを再利用して、同じことを示すサンプル アプリケーションを作成しました。ここから入手できます - OpenGLText_eclipse_project.zip
つまり、Grid.java、LabelMaker.java、NumericSprite.java を完全に再利用できます。次に、TextRenderer.java に示すように、上記のクラスを使用するためにレンダラーに数行のコードを追加します。
これは、スコアが継続的に更新される様子です。
基本的に、スコアのレンダリングは次のように簡単です。
LabelMaker mLabels = new LabelMaker();
mLabels.initialize(gl);
mLabels.beginAdding(gl);
int mLabelMsPF = mLabels.add(gl, "Score:", mLabelPaint);
mLabels.endAdding(gl);
mLabels.beginDrawing(gl, mWidth, mHeight);
mLabels.draw(gl, 0, 0, mLabelMsPF);
mLabels.endDrawing(gl);
NumericSprite mNumericSprite = new NumericSprite();
mNumericSprite.setValue(16);
mNumericSprite.draw(gl, 0, 0, mWidth, mHeight);
テキストは、OpenGL レイヤーとは異なるレイヤーにある必要があります。
<FrameLayout>
<GLSurfaceView/>
<LinearLayout android:layout_gravity="top|right" >
<TextView android:id="@+id/score" ... />
</LinearLayout>
</FrameLayout>
FrameLayout を使用すると、ビューを上下に積み重ねることができます。次に、テキストを次のように設定します。
( (TextView) findViewById(R.id.score) ).setText( "Your Score" );
OpenGL がテキストの上に描画されるのを避けるために、GLSurfaceView の各レンダリング後にスコア レイアウトを強制的に再描画する必要がある場合があります。(これについてはわかりません)
パフォーマンスのために、テキスト領域をできるだけ小さくします (LinearLayout の幅と高さの wrap_content)。
ビットマップ キャンバス drawText を使用しましたが、おそらく小さいビットマップとフォント サイズでテクスチャとして使用する必要がありました
bitmap = Bitmap.createBitmap(256, 256, Bitmap.Config.ARGB_8888);
canvas = new Canvas(bitmap);
h = (int)((((System.currentTimeMillis()/1000)/60)/60)%60);
m = (int)(((System.currentTimeMillis()/1000)/60)%60);
s = (int)((System.currentTimeMillis()/1000)%60);
paint = new Paint();
paint.setColor(Color.MAGENTA);
paint.setTextAlign(Align.CENTER);
paint.setTypeface(Typeface.DEFAULT_BOLD);
paint.setTextSize(55);
time = String.valueOf(h) + "h" + String.valueOf(m) + "m" + String.valueOf(s) + "s";
canvas.drawText(time, bitmap.getWidth()/2, 100, paint);
int[] textureIds = new int[1];
gl.glGenTextures(1, textureIds, 0);
textureId = textureIds[0];
gl.glBindTexture(GL10.GL_TEXTURE_2D, textureId);
GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0);
gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_NEAREST);
gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_NEAREST);
gl.glBindTexture(GL10.GL_TEXTURE_2D, 0);
第 9 章の src/ com.badlogic.androidgames.framework.gl.Font.javaは、ビットマップ フォントに使用するもので、Codeheads Bitmap Font Generator でビットマップ フォントを生成します。
私の意見では、RelativeLayout を使用して GLSurfaceView をラップし、別の TextView を必要な場所に配置することもできます。次に、Renderer コンストラクターで、TextView 参照 GLES20TriangleRenderer(Context context, TextView tv) を渡します onDrawFrame メソッドで、呼び出します
((Activity)mContext).runOnUiThread(new Runnable(){
@Override
public void run() {
// TODO Auto-generated method stub
tv.setText(Math.random() + " random");
}
});
スコア テキストをビットマップに描画し、このビットマップをテクスチャとして使用する必要があります。
ビットマップにテキストを描画するには、次のコードを使用できます。
// Create and draw a texto to your bitmap.
Bitmap bm = Bitmap.createBitmap(300, 100, Bitmap.Config.ARGB_8888);
Canvas c = new Canvas(bm);
Paint p = new Paint();
p.setColor(Color.RED);
c.drawText("YOUR SCORE", 0, 0, new Paint());
TextView
に aを付けて、そこから表示するだけActivity
です。WindowManager
以下の通り。
TextView tv = new TextView(this);
tv.setText("FPS: 0");
//get WindowManager from Activity
WindowManager w = this.getWindowManager();
//setup view LayoutParams
WindowManager.LayoutParams lp = new WindowManager.LayoutParams(
ViewGroup.LayoutParams.WRAP_CONTENT,
ViewGroup.LayoutParams.WRAP_CONTENT,
0,
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
| WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL,
PixelFormat.TRANSPARENT);
//position
lp.gravity = Gravity.RIGHT | Gravity.TOP;
//attach view
w.addView(tv,lp);
次に、これを更新します
activity.runOnUiThread(new Runnable(){
@Override
public void run() {
tv.setText("FPS: " + fps);
}
});