2013-03-12 52 views
7

在onDrawFrame方法中,是否有任何簡單的方法可以顯示在右上角沒有任何紋理的簡單白色文本,該文本在實現Renderer的類中的每個框架上發生變化?它是2D的,所以我相信沒有必要進行任何轉換。我發現了很多教程,但它們都顯得過於複雜,代碼太多。也許這隻需要幾行代碼就可以完成?如果這不可行,那麼在不修改現有代碼的情況下最簡單的方法是什麼?由於我是新手,請顯示完整的代碼。顯示在每個框架上發生變化的文本(如分數)

+1

更新此有了一個良好的位圖字體庫,它可能只需要幾行。如果找不到圖書館,則需要更多。 – Geobits 2013-03-12 20:22:58

+0

@Geobits任何關於我可以選擇哪個庫的建議? – 2013-03-13 03:29:52

+1

我最後一次看,我找不到我想要的東西。但是,這不僅僅是「顯示一些數字」,所以可能有些東西給你,我只是不知道。 – Geobits 2013-03-13 03:39:20

回答

2

我用一個位圖的畫布的drawText,但我仍然有,如果你在第9章的src/com.badlogic去here使用它作爲紋理,可能與一個較小的位圖和字體大小

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); 

。 androidgames.framework.gl.Font.java是我用於位圖字體和我生成的位圖字體Codeheads位圖字體生成器

+0

也許你可以顯示一些代碼?謝謝。 – 2013-03-13 03:30:10

+0

我更新了一些代碼,即時通訊不知道它是否會工作如何你想要「每一幀」,但它的值得一試我猜 – JRowan 2013-03-13 03:59:54

+0

地理位置可能是正確的,雖然有關位圖字體庫,我有一個這是定製雖然它關係到一大堆班,我可以指向你的代碼?我從一本書中學到了它 – JRowan 2013-03-13 04:04:54

11

渲染器是一種OpenGL方法。 OpenGL ES本身不支持文本。這留下下列選項:

  1. 使用紋理,使用Android的Canvas類繪製它。
  2. 使用庫。這很可能也會畫到紋理。
  3. 用多邊形創建文本。

由於您的問題是要求解決方案不繪製到紋理,那麼1和2都出來了。既然你想簡單一點,3也是。沒有好的解決方案。

另一種可供選擇的方法是在您正在使用的GLSurfaceView上疊加另一個視圖。您可以使用RelativeLayout輕鬆堆疊兩個視圖,其中一個視圖可以錨定到屏幕的右上角。下面的僞代碼:

<RelativeLayout ... /> 
    <GLSurfaceView ... /> 
    <TextView ... /> 
</RelativeLayout> 

這種方法的好處是可以讓您脫離OpenGL的要求來做文本。我已經在我的幾個應用程序上成功完成了這項工作。

2

文本應該與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"); 

您可能需要強制比分佈局重新劃分的GLSurfaceView的每個渲染之後,以避免OpenGL的繪製上的文字之上。 (不知道這一點)

對於性能的緣故,使文本區儘可能小(WRAP_CONTENT的寬度和的LinearLayout高度)

1

在我看來,你可以使用的RelativeLayout包住GLSurfaceView ,還有另一個TextView放在任何你想要的地方。然後在你的渲染器的構造,通過TextView的參考 GLES20TriangleRenderer(上下文的背景下,TextView的電視) 在onDrawFrame方法,調用

((Activity)mContext).runOnUiThread(new Runnable(){ 

     @Override 
     public void run() { 
      // TODO Auto-generated method stub 
      tv.setText(Math.random() + " random"); 

     } 

    }); 
1

你需要你的分數文本繪製到一個位圖,並使用該位圖作爲後一個紋理。

吸取位文本,你可以使用此代碼:

// 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()); 
7

你可能想看看裏面自帶了Android SDK樣本API演示項目。有一個OpenGL Sprite文本樣本,它完全符合你的需求。

您可以通過仿真器(或設備)安裝API演示和導航,看演示: API演示>顯卡>的OpenGL ES>雪碧文本

下面是截圖:

enter image description here

在渲染器的onDrawFrame方法中,屏幕右下角的文本在每個幀上都會更改。

你可以在你的Android SDK的樣本目錄中找到源代碼: ApiDemos的\ src \ COM \例子\機器人\的API \圖形\ spritetext

你需要幾個文件複製到項目並且只需很少的代碼就可以實現相同的功能。

示例應用程序: 我已經創建了一個示例應用程序來展示從API演示項目重用代碼相同。你可以從這裏得到它 - OpenGLText_eclipse_project.zip

簡而言之,你可以重複使用Grid.java,LabelMaker.java,NumericSprite.java。然後在你的渲染器中添加幾行代碼,以使用我的TextRenderer.java中所示的上述類。

下面是連續更新分數的外觀。

enter image description here

基本上,使比分是如此簡單:

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); 
+0

它現在沒有顯示任何內容 – 2013-03-30 01:14:36

+0

您是否運行API演示或我的示例應用程序?我的應用程序是Sprite Text API演示的修剪版本,因爲我已經移除了三角形精靈。爲了渲染Score,只需要簡單的代碼就可以了。您當然可以在特定於您的應用程序的屏幕上繪製更多內容。 – appsroxcom 2013-03-30 03:09:09

+0

+1感謝您的指導,爲此僅提取必要的代碼。對我很好:) – dcoz 2013-10-23 21:22:45

3

嘗試看看CodeHead的位圖字體生成器和Android裝載機,並嘗試使用此代碼。

CBFG

Android Loader

0

你可以簡單地附上TextViewActivityWindowManager,並從那裏表現出來。如下。

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); 
    } 

}); 

enter image description here

相關問題