2012-09-19 9 views

Odpowiedz

10

Tak to jest z pewnością możliwe, napisałem nawet how-to tutaj; http://www.felixjones.co.uk/neo%20website/Android_View/

Jednak w przypadku elementów statycznych, które nie ulegną zmianie, opcja bitmapy może być lepsza.

+0

Znalazłem, że nie wszystkie widoki można narysować. TextureView nie może być rysowany w ten sposób. Czy możesz to rozwiązać? – dragonfly

+0

@fadden Jeśli używam TextureView, znalazłem OnSurfaceTextureAvailable z TextureView.OnFrameAvailableListener nie oddzwonił. Dlaczego nie można rysować TextureView w ten sposób? – dragonfly

0

Przynajmniej ktoś zdołał uczynić tekst w następujący sposób:

Rendering Text in OpenGL on Android

To opisuje metodę użyłem do świadczenia wysokiej jakości tekst dynamiczny sprawnie użyciu OpenGL ES 1.0, TrueType/OpenType pliki czcionek.

[...]

Cały proces jest całkiem proste. Generujemy mapę bitową (jako teksturę), obliczamy i przechowujemy rozmiar każdego znaku, a także jego położenie na fakturze (współrzędne UV). Jest kilka innych drobniejszych szczegółów, ale do tego dojdziemy.

OpenGL ES 2.0 Wersja: https://github.com/d3kod/Texample2

9

Cały projekt demonstracyjny, który renderuje widok tekstur GL w czasie rzeczywistym w efektywny sposób, można znaleźć w this repo. Pokazuje, jak renderować WebView do tekstury GL w czasie rzeczywistym jako przykład.

również krótki kod może wyglądać następująco (zaczerpnięte z projektu demo z repo powyżej):

public class GLWebView extends WebView { 

    private ViewToGLRenderer mViewToGLRenderer; 
    ... 
    // drawing magic 
    @Override 
    public void draw(Canvas canvas) { 
     //returns canvas attached to gl texture to draw on 
     Canvas glAttachedCanvas = mViewToGLRenderer.onDrawViewBegin(); 
     if(glAttachedCanvas != null) { 
      //translate canvas to reflect view scrolling 
      float xScale = glAttachedCanvas.getWidth()/(float)canvas.getWidth(); 
      glAttachedCanvas.scale(xScale, xScale); 
      glAttachedCanvas.translate(-getScrollX(), -getScrollY()); 
      //draw the view to provided canvas 
      super.draw(glAttachedCanvas); 
     } 
     // notify the canvas is updated 
     mViewToGLRenderer.onDrawViewEnd(); 
    } 

    ... 
} 


public class ViewToGLRenderer implements GLSurfaceView.Renderer{ 

    private SurfaceTexture mSurfaceTexture; 
    private Surface mSurface; 

    private int mGlSurfaceTexture; 
    private Canvas mSurfaceCanvas; 

    ... 

    @Override 
    public void onDrawFrame(GL10 gl){ 
     synchronized (this){ 
      // update texture 
      mSurfaceTexture.updateTexImage(); 
     } 
    } 

    @Override 
    public void onSurfaceChanged(GL10 gl, int width, int height){ 
     releaseSurface(); 
     mGlSurfaceTexture = createTexture(); 
     if (mGlSurfaceTexture > 0){ 
      //attach the texture to a surface. 
      //It's a clue class for rendering an android view to gl level 
      mSurfaceTexture = new SurfaceTexture(mGlSurfaceTexture); 
      mSurfaceTexture.setDefaultBufferSize(mTextureWidth, mTextureHeight); 
      mSurface = new Surface(mSurfaceTexture); 
     } 

    } 

    public Canvas onDrawViewBegin(){ 
     mSurfaceCanvas = null; 
     if (mSurface != null) { 
      try { 
       mSurfaceCanvas = mSurface.lockCanvas(null); 
      }catch (Exception e){ 
       Log.e(TAG, "error while rendering view to gl: " + e); 
      } 
     } 
     return mSurfaceCanvas; 
    } 

    public void onDrawViewEnd(){ 
     if(mSurfaceCanvas != null) { 
      mSurface.unlockCanvasAndPost(mSurfaceCanvas); 
     } 
     mSurfaceCanvas = null; 
    } 
} 

wyjście ekranu Demo:

Powiązane problemy