2013-03-12 6 views
7

पर बदलता है, क्या दाएं शीर्ष कोने पर किसी भी बनावट के बिना सरल सफेद टेक्स्ट प्रदर्शित करने का कोई आसान तरीका है जो कक्षा में प्रत्येक फ्रेम पर बदलता है जो रेडियरर को लागू करता है, ड्रॉफ्रेम विधि में? यह 2 डी है, इसलिए मुझे विश्वास है कि कोई भी बदलाव करने की जरूरत नहीं है। मुझे कई ट्यूटोरियल मिल गए हैं, लेकिन वे सभी बहुत अधिक कोड के साथ बहुत जटिल लगते हैं। शायद यह कोड की कुछ पंक्तियों के साथ किया जा सकता है? यदि यह संभव नहीं है, तो मौजूदा कोड को संशोधित किए बिना इसे करने का सबसे आसान तरीका क्या है? कृपया पूरा कोड दिखाएं क्योंकि मैं नौसिखिया हूं।पाठ को प्रदर्शित करना (जैसे स्कोर) जो प्रत्येक फ्रेम

+1

इस अद्यतन करते हैं, यह केवल कुछ लाइनें लग सकता है। यदि आपको लाइब्रेरी नहीं मिल रही है, तो इसमें बहुत कुछ लगेगा। – Geobits

+0

@Gobits कोई भी सुझाव जिस पर मैं पुस्तकालय चुन सकता हूं? –

+1

पिछली बार मैंने देखा कि मुझे वह नहीं मिला जो मैंने वही किया था। हालांकि, यह सिर्फ "कुछ संख्याएं प्रदर्शित नहीं" था, इसलिए आपके लिए कुछ हो सकता है, मैं सिर्फ हाथ से नहीं जानता। – Geobits

उत्तर

2

मैं drawText कैनवास एक बिटमैप करते थे, लेकिन मैं अभी भी, एक बनावट के रूप में उपयोग करने के लिए शायद एक छोटे बिटमैप और फ़ॉन्ट आकार

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

साथ अगर आप अध्याय 9 src/com.badlogic में here जाना था। androidgames.framework.gl.Font.java मैं बिटमैप फ़ॉन्ट्स के लिए उपयोग करता हूं और मैं कोडहेड्स बिटमैप फ़ॉन्ट जनरेटर

+0

शायद आप कुछ कोड दिखा सकते हैं? धन्यवाद। –

+0

मैंने कुछ कोड के साथ अपडेट किया है, मुझे यकीन नहीं है कि यह काम करेगा कि आप "हर फ्रेम" कैसे चाहते हैं, लेकिन मुझे लगता है कि – JRowan

+0

geobits शायद बिटमैप फ़ॉन्ट लाइब्रेरी के बारे में सही है, मेरे पास एक कस्टम है जो इसे जोड़ता है कक्षाओं का एक पूरा समूह, मैं आपको कोड की तरफ इंगित कर सकता हूं? मैंने इसे – JRowan

11

रेंडरर एक ओपनजीएल विधि है, के साथ बिटमैपफोंट उत्पन्न करता हूं। ओपनजीएल ईएस मूल रूप से पाठ का समर्थन नहीं करता है। यह निम्न विकल्पों को छोड़ देता है:

  1. एक बनावट का उपयोग करें, एंड्रॉइड के कैनवास वर्ग का उपयोग करके इसे आकर्षित करें।
  2. लाइब्रेरी का उपयोग करें। यह संभवतः एक बनावट के लिए भी आकर्षित करेगा।
  3. बहुभुज के साथ पाठ बनाएँ।

चूंकि आपका प्रश्न ऐसे समाधान के लिए पूछ रहा है जो एक बनावट को आकर्षित नहीं करता है, तो 1 और 2 दोनों बाहर हैं। और चूंकि आप कुछ सरल चाहते हैं, 3 भी बाहर है। कोई अच्छा समाधान छोड़ना।

विचार करने का विकल्प GLSurfaceView के शीर्ष पर एक और दृश्य को लेना है जिसका आप उपयोग कर रहे हैं। आप आसानी से दो विचारों को ढेर करने के लिए रिलेवेटिवआउट का उपयोग कर सकते हैं, एक टेक्स्टव्यू होने के नाते आप स्क्रीन के ऊपरी दाएं कोने में एंकर कर सकते हैं। नीचे छद्म कोड:

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

इस दृष्टिकोण से आपको अपना टेक्स्ट करने के लिए ओपनजीएल आवश्यकताओं से बाहर खींचने का लाभ है। मैंने इसे अपने कुछ ऐप्स पर सफलतापूर्वक किया है।

2

टेक्स्ट ओपनजीएल की तुलना में एक अलग परत में होना चाहिए।

<FrameLayout> 
    <GLSurfaceView/> 
    <LinearLayout android:layout_gravity="top|right" > 
     <TextView android:id="@+id/score" ... /> 
    </LinearLayout> 
</FrameLayout> 

फ़्रेमलेआउट दृश्यों को दूसरे के शीर्ष पर एक स्थानांतरित करने की अनुमति देता है।

((TextView) findViewById(R.id.score)).setText("Your Score"); 

आप GLSurfaceView में से प्रत्येक के प्रतिपादन के बाद स्कोर लेआउट के redrawing मजबूर करने के लिए है कि ओपन पाठ के शीर्ष पर ड्रॉ से बचने की जरूरत हो सकता है: फिर साथ पाठ की स्थापना की। (इस बारे में निश्चित नहीं)

प्रदर्शन के लिए,

1

मेरी राय में (चौड़ाई और LinearLayout की ऊंचाई के लिए wrap_content) को छोटे से छोटा पाठ क्षेत्र बनाने के लिए, आप GLSurfaceView रैप करने के लिए एक RelativeLayout उपयोग कर सकते हैं , और जहां भी आप चाहते हैं उसे रखने के लिए एक और टेक्स्ट व्यू भी।फिर अपने प्रतिपादक निर्माता में,, 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

आपको API प्रदर्शन परियोजना जो एंड्रॉयड एसडीके नमूने के साथ आता है पर एक नज़र लेने के लिए कर सकते हैं। एक ओपनजीएल स्प्राइट टेक्स्ट नमूना है जो वही करता है जो आप चाहते हैं।

आप एमुलेटर (या उपकरण) पर एपीआई प्रदर्शन स्थापित करने और नेविगेट करके डेमो देख सकते हैं: एपीआई प्रदर्शन> ग्राफिक्स> OpenGL ES> स्प्राइट पाठ

यहाँ एक स्क्रीनशॉट है:

enter image description here

रेंडरर के ड्रॉफ्रेम विधि पर प्रत्येक फ्रेम पर स्क्रीन के निचले दाएं कोने में स्थित टेक्स्ट बदल दिया गया है।

आप अपने Android एसडीके नमूने निर्देशिका में स्रोत कोड पा सकते हैं: ApiDemos \ src \ कॉम \ उदाहरण \ एंड्रॉयड \ apis \ ग्राफिक्स \ spritetext

आप अपने प्रोजेक्ट में कुछ फ़ाइलों की प्रतिलिपि बनाने की आवश्यकता होगी और कोड की बहुत कम लाइनों के साथ एक ही कार्यक्षमता प्राप्त कर सकते हैं।

नमूना आवेदन: मैंने एपीआई डेमो परियोजना से कोड का पुन: उपयोग करके इसका प्रदर्शन करने के लिए नमूना आवेदन बनाया है। आप इसे यहां से प्राप्त कर सकते हैं - OpenGLText_eclipse_project.zip

संक्षेप में, आप Grid.java, LabelMaker.java, NumericSprite.java को पूरी तरह से पुन: उपयोग कर सकते हैं। फिर मेरे TextRenderer.java

में दिखाए गए उपर्युक्त वर्गों का उपयोग करने के लिए अपने रेंडरर में कोड की कुछ पंक्तियां जोड़ें, यह लगातार अद्यतन अपडेट के साथ दिखता है।

enter image description here

असल में, स्कोर प्रतिपादन इस के रूप में सरल है: CodeHead के बिटमैप फ़ॉन्ट जेनरेटर और एंड्रॉयड लोडर को देखने के लिए

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

पुस्तक से सीखा है, यह अब कुछ भी नहीं दिखाता है –

+0

क्या आपने एपीआई डेमो या मेरा नमूना आवेदन चलाया था? मेरा एप्लिकेशन स्प्राइट टेक्स्ट एपीआई डेमो का एक छंटनी संस्करण है क्योंकि मैंने त्रिभुज स्प्राइट को हटा दिया है। ताकि स्कोर को प्रस्तुत करने के लिए कोड की किस पंक्ति की आवश्यकता हो, इसका पालन करना आसान हो। आप निश्चित रूप से अपने ऐप के लिए स्क्रीन पर अधिक सामान खींच सकते हैं। – appsroxcom

+0

+1 इसके लिए आवश्यक कोड निकालने के आपके निर्देशों के लिए धन्यवाद। मेरे लिए महान काम करता है :) – dcoz

3

प्रयास करें, और इस कोड का उपयोग करने का प्रयास करें।

CBFG

Android Loader

0

आप बस अपनी Activity के WindowManager करने के लिए एक TextView देते हैं और वहां से वह दिखा सकता है। जैसे दिए गए हैं।

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

संबंधित मुद्दे