

Android 端末向けに OpenGL を使った簡単なゲームを作ろうと思っており、その中で独自のフォントを使いたいです。

作るアプリでは以下を使っています。

  * AppCompatActivity
  * GLSurfaceView
  * Renderer

また、描画のためには以下を使っています。この3つは、GLSurfaceView配下です。

  * Bitmap
  * Canvas
  * Paint

フォントを使うために `paint.setTypeface( Typeface.createFromAsset(getAssets(),
"fonts/ipag.ttf") );` を使いたいのですが、getAssets 解決ができません。  
これを解決する方法がわかりません。

どなたか解決方法を教えていただけるとありがたいです。  
よろしくお願いします。

### ソースコード

  * MainActivity.java

[code]

    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);
                }
            }
        }
    
    }
    
[/code]

  * MyGLSurfaceView.java

[code]

    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);
        }
    
    }
    
[/code]

  * GLRenderer.java

[code]

    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;
        }
    }
    
[/code]


CC BY-SA 4.0
2018-11-03T16:45:08.300
49940
2021-01-05T11:29:34.240
2021-01-05T11:29:34.240
3060
30826
question
java android
Androidで標準以外のフォントを使用する


getAssets()は、実際にはActivity.getAssets()等の呼び出しであるため、createStrImageの引数でActivity等の参照を渡す必要があると思われます。


CC BY-SA 4.0
2018-11-06T10:55:36.850
50015
2018-11-06T10:55:36.850
8795
49940
answer