Androidで標準以外のフォントを使用する
ma2といます。10年前に障害をおってしまい、ようやく復帰に向けてコードを書き始めたものです。
勝手がわからず理解・調べが甘いところがあるかもしれませんがその際は容赦の程お願いします。
さて、本題です。
android携帯・タブレットでOpenGLを使った簡単なゲームを作ろうと思います。
開発をしない人たちに向けて公開する予定があるので独自のフォントを使いたいです。
作るアプリは、
- AppCompatActivity
- GLSurfaceView
- Renderer
を使っています。
また、描画のために
- Bitmap
- Canvas
- Paint
を使っています。この3つは、GLSurfaceView配下です。
フォントを使うために paint.setTypeface( Typeface.createFromAsset(getAssets(), "fonts/ipag.ttf") ); を使いたいのですが、getAssets 解決ができません。
これを解決する方法がわかりません。
どなたか解決方法を教えていただけるとありがたいです。
よろしくお願いします。
[追加]
- MainActivity.java
package com.example.ma2.opengles; import android.content.Context; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Typeface; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.app.Activity; import android.opengl.GLSurfaceView; import android.os.Build; import android.view.View; import android.widget.TextView; public class MainActivity extends AppCompatActivity { private GLSurfaceView mGLView; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Create a GLSurfaceView instance and set it // as the ContentView for this Activity mGLView = new MyGLSurfaceView(this); setContentView(mGLView); } @Override protected void onPause() { super.onPause(); mGLView.onPause(); } @Override protected void onResume() { super.onResume(); mGLView.onResume(); } @Override public void onWindowFocusChanged(boolean hasFocus) { super.onWindowFocusChanged(hasFocus); if (hasFocus) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { getWindow().getDecorView().setSystemUiVisibility( View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); //this line is api 19+ } else { getWindow().getDecorView().setSystemUiVisibility( View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_FULLSCREEN); } } } }
- MyGLSurfaceView.java
package com.example.ma2.opengles; import android.content.Context; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.Typeface; import android.opengl.GLSurfaceView; public class MyGLSurfaceView extends GLSurfaceView { GLRenderer myRenderer; public MyGLSurfaceView(Context context) { super(context); myRenderer = new GLRenderer(); setRenderer(myRenderer); } }
- GLRenderer.java
package com.example.ma2.opengles; import javax.microedition.khronos.egl.EGLConfig; import javax.microedition.khronos.opengles.GL10; import android.content.Context; import android.content.res.AssetManager; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Paint.FontMetrics; import android.graphics.Typeface; import android.opengl.GLSurfaceView; import android.opengl.GLSurfaceView.Renderer; import android.opengl.GLUtils; import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.nio.FloatBuffer; public class GLRenderer implements Renderer { @Override public void onSurfaceCreated(GL10 gl, EGLConfig config) { } @Override public void onSurfaceChanged(GL10 gl, int width, int height) { Bitmap bmp; gl.glViewport(0, 0, width, height); { // Canvasを使って、文字をBitMap化 bmp = createStrImage( "123" ); } gl.glEnable(GL10.GL_TEXTURE_2D); int[] buffers = new int[1]; gl.glGenTextures(1, buffers, 0); int textureName = buffers[0]; gl.glBindTexture(GL10.GL_TEXTURE_2D, textureName); GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bmp, 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); bmp.recycle(); } @Override public void onDrawFrame(GL10 gl) { gl.glClearColor(1.0f, 0.50f, 0.50f, 1.0f); gl.glClear(GL10.GL_COLOR_BUFFER_BIT); float uv[] = { 0.0f, 0.0f,// 左上 0.0f, 1.0f,// 左下 1.0f, 0.0f,// 右上 1.0f, 1.0f,// 右下 }; ByteBuffer bbuv = ByteBuffer.allocateDirect(uv.length * 4); bbuv.order(ByteOrder.nativeOrder()); FloatBuffer fbuv = bbuv.asFloatBuffer(); fbuv.put(uv); fbuv.position(0); gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY); gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, fbuv); float positions[] = { // ! x y z -1.0f, 1.0f, 0.0f, // 左上(uv一行目に対応) -1.0f,-1.0f, 0.0f, // 左下(uv二行目に対応) 1.0f, 1.0f, 0.0f, // 右上(uv三行目に対応) 1.0f,-1.0f, 0.0f, // 右下(uv四行目に対応) }; ByteBuffer bb = ByteBuffer.allocateDirect(positions.length * 4); bb.order(ByteOrder.nativeOrder()); FloatBuffer fb = bb.asFloatBuffer(); fb.put(positions); fb.position(0); gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); gl.glVertexPointer(3, GL10.GL_FLOAT, 0, fb); gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4); } public Bitmap createStrImage( String str ) { Paint paint = new Paint( Paint.ANTI_ALIAS_FLAG ); paint.setTypeface( Typeface.DEFAULT ); paint.setTypeface( Typeface.createFromAsset(getAssets(), "fonts/ipag.ttf") ); paint.setTextSize( 30 ); Paint.FontMetrics fm = paint.getFontMetrics(); paint.setARGB( 255, 255, 255, 0 ); float width = paint.measureText( str ); float height = -fm.top + fm.bottom; Bitmap bitmap = Bitmap.createBitmap( (int)width, (int)height, Bitmap.Config.ARGB_8888 ); Canvas canvas = new Canvas( bitmap ); canvas.drawText( str, 0, -fm.top, paint ); return bitmap; } }