在onDrawFrame方法中,是否有任何簡單的方法可以顯示在右上角沒有任何紋理的簡單白色文本,該文本在實現Renderer的類中的每個框架上發生變化?它是2D的,所以我相信沒有必要進行任何轉換。我發現了很多教程,但它們都顯得過於複雜,代碼太多。也許這隻需要幾行代碼就可以完成?如果這不可行,那麼在不修改現有代碼的情況下最簡單的方法是什麼?由於我是新手,請顯示完整的代碼。顯示在每個框架上發生變化的文本(如分數)
回答
我用一個位圖的畫布的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位圖字體生成器
渲染器是一種OpenGL方法。 OpenGL ES本身不支持文本。這留下下列選項:
- 使用紋理,使用Android的Canvas類繪製它。
- 使用庫。這很可能也會畫到紋理。
- 用多邊形創建文本。
由於您的問題是要求解決方案不繪製到紋理,那麼1和2都出來了。既然你想簡單一點,3也是。沒有好的解決方案。
另一種可供選擇的方法是在您正在使用的GLSurfaceView上疊加另一個視圖。您可以使用RelativeLayout輕鬆堆疊兩個視圖,其中一個視圖可以錨定到屏幕的右上角。下面的僞代碼:
<RelativeLayout ... />
<GLSurfaceView ... />
<TextView ... />
</RelativeLayout>
這種方法的好處是可以讓您脫離OpenGL的要求來做文本。我已經在我的幾個應用程序上成功完成了這項工作。
文本應該與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高度)
在我看來,你可以使用的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");
}
});
你需要你的分數文本繪製到一個位圖,並使用該位圖作爲後一個紋理。
吸取位文本,你可以使用此代碼:
// 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());
你可能想看看裏面自帶了Android SDK樣本API演示項目。有一個OpenGL Sprite文本樣本,它完全符合你的需求。
您可以通過仿真器(或設備)安裝API演示和導航,看演示: API演示>顯卡>的OpenGL ES>雪碧文本
下面是截圖:
在渲染器的onDrawFrame方法中,屏幕右下角的文本在每個幀上都會更改。
你可以在你的Android SDK的樣本目錄中找到源代碼: ApiDemos的\ src \ COM \例子\機器人\的API \圖形\ spritetext
你需要幾個文件複製到項目並且只需很少的代碼就可以實現相同的功能。
示例應用程序: 我已經創建了一個示例應用程序來展示從API演示項目重用代碼相同。你可以從這裏得到它 - 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);
它現在沒有顯示任何內容 – 2013-03-30 01:14:36
您是否運行API演示或我的示例應用程序?我的應用程序是Sprite Text API演示的修剪版本,因爲我已經移除了三角形精靈。爲了渲染Score,只需要簡單的代碼就可以了。您當然可以在特定於您的應用程序的屏幕上繪製更多內容。 – appsroxcom 2013-03-30 03:09:09
+1感謝您的指導,爲此僅提取必要的代碼。對我很好:) – dcoz 2013-10-23 21:22:45
你可以簡單地附上TextView
您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);
}
});
- 1. 當組合框值發生變化時,顯示一個文本框
- 2. 在'Enter'上提交一個文本框或者如果jQuery發生變化
- 3. 兩個分支上的一個分支上的文件更改發生變化
- 4. 當我每次上下滾動時,Android RecyclerView顯示項目發生變化
- 5. C#當標籤上的文字發生變化時取消選中文本框
- 6. 驗證摘要分別顯示每個文本框。在一個asp.net網站
- 7. 使用框架在屏幕上顯示一些文本Cocos2D
- 8. 當json數據發生變化時觸發ng顯示
- 9. SSIS人口的支架變化趨勢正在發生變化
- 10. jquery當一個框架的位置發生變化時執行函數
- 11. HTML窗體 - 當文本框的值發生變化時
- 12. 判斷文本框中的內容是否發生變化
- 13. 如何在兩個不同的文本框上顯示值
- 14. 當在UITabBarController框架中選擇UIViewController時,視圖發生變化
- 15. 如何分隔每個文本框的每個值
- 16. 如何在框架內的文本框,組合框前面顯示圖片框?
- 17. 當另一個文本框的內容發生變化時啓用一個文本框
- 18. 顯示textarea如果列表框中的選定項目發生變化
- 19. 多個動態文本分數顯示。逐個修改每個文本並將分數遞增一定數字
- 20. 檢測文本框值隨jQuery發生變化時
- 21. asp.net GridView文本框過濾器發生變化
- 22. 檢測HTML文本框中發生了什麼變化
- 23. 當文本框內的文本發生變化時,會調用什麼事件?
- 24. 每一個新的文本顯示在IRC時顯示新線
- 25. 在文本下方懸停時文本顏色發生變化
- 26. 如何在listView中的每個條目上顯示覆選框
- 27. 威爾詹金斯將顯示在bitbucket中發生的變化
- 28. applet窗口的外觀在後續顯示中發生變化
- 29. 如何在ASP.NET的每個文本框中生成require字段?
- 30. ListView行突出顯示數據發生變化
更新此有了一個良好的位圖字體庫,它可能只需要幾行。如果找不到圖書館,則需要更多。 – Geobits 2013-03-12 20:22:58
@Geobits任何關於我可以選擇哪個庫的建議? – 2013-03-13 03:29:52
我最後一次看,我找不到我想要的東西。但是,這不僅僅是「顯示一些數字」,所以可能有些東西給你,我只是不知道。 – Geobits 2013-03-13 03:39:20