2011-10-10 45 views
7

पर मापने वाले पाठ को मैं पाठ मापने और स्केल किए गए कैनवास के साथ संघर्ष कर रहा हूं।स्केल किए गए कैनवास

जब कैनवास अनसुलझा हो जाता है, getTextBounds और माप टेक्स्ट सटीक परिणाम प्रदान करते हैं। हालांकि, जब कैनवास को स्केल किया जाता है तो दोनों विधियां मुद्रित पाठ के वास्तविक आकार से मेल खाने वाले परिणाम नहीं देती हैं।

मैं निम्नलिखित OnDraw विधि के साथ दृश्य का एक उपवर्ग बना लिया है परीक्षण के लिए: स्केलिंग = 0.5 मैं निम्नलिखित उत्पादन प्राप्त करने के लिए

final float scaling = 0.51f; 
final int fontSize = 50; 

canvas.scale(scaling, scaling); 
font = Typeface.create("Arial", Typeface.NORMAL); 

Paint paint = new Paint(); 
paint.setColor(0xff4444ff); 
paint.setTypeface(font); 
paint.setTextSize(fontSize); 
paint.setAntiAlias(true); 

int x = 10; 
int y = 100; 
final String text = "Lorem ipsum dolor sit amet, consectetur adipisici elit..."; 
canvas.drawText(text, x, y, paint); 

// draw border using getTextBounds 

paint.setColor(0xffff0000); 
paint.setStyle(Paint.Style.STROKE); 
paint.setTypeface(font); 
paint.setTextSize(fontSize); 
Rect bounds = new Rect(); 
paint.getTextBounds(text, 0, text.length(), bounds); 
bounds.offset(x, y); 
paint.setColor(0x80ffff00); 
canvas.drawRect(bounds, paint); 

// draw border using measureText 

float w = paint.measureText(text); 
bounds.left = x; 
bounds.right = (int) Math.ceil(bounds.left + w); 
bounds.top -= 10; 
bounds.bottom += 10; 
paint.setColor(0x8000ffff); 
paint.setPathEffect(new DashPathEffect(new float[] { 10, 10 }, 0)); 
canvas.drawRect(bounds, paint); 

: स्केलिंग के लिए canvas scaling 0.5

= 0,51 निम्न परिणाम दिखाया गया है: canvas scaling 0.51

पीले ठोस सीमा गेटटेक्स्टबाउंड से प्राप्त आय को चिह्नित करती है, धराशायी सायन रेक्ट चौड़ाई वाले फ्रेम का उपयोग करके प्रस्तुत किया जाता है। ओम माप पाठ।

जैसा कि आप देख सकते हैं, स्केलिंग = 0.5 वाला टेक्स्ट मापित आयामों से छोटा है और स्केलिंग = 0.51 के साथ खींचा गया पाठ मापा आयाम से बड़ा तरीका है।

किसी भी मदद की सराहना की जाती है!

उत्तर

4

ठीक है, बस पता चला कि इस मुद्दे को कैसे बाधित किया जाए।

समस्या यह है कि पेंट कैनवास स्केलिंग के बारे में नहीं जानता है। इसलिए माप टेक्स्ट और getTextBounds unscaled परिणाम प्रदान करते हैं। लेकिन चूंकि फ़ॉन्ट आकार रैखिक रूप से स्केल नहीं करता है (हालांकि, खींचा गया रेक्ट करता है), आपको उस प्रभाव को मैन्युअल रूप से बनाना होगा।

तो समाधान होगा:

// paint the text as usual 
Paint paint = new Paint(); 
paint.setTypeface(font); 
paint.setTextSize(fontSize); 
canvas.drawText(text, x, y, paint); 


// measure the text using scaled font size and correct the scaled value afterwards 
Paint paint = new Paint(); 
paint.setTypeface(font); 
paint.setTextSize(fontSize * scaling); 
float w = paint.measureText(text)/scaling; 
0

Mono for Android का उपयोग करते हुए मैं जैसा कि यहाँ दिखाया प्रदर्शन मीट्रिक का उपयोग करने के लिए किया था:

public override System.Drawing.SizeF MeasureString(MyFont f, string text) 
{ 
    Rect r = new Rect(); 

    f.DrawingFont.GetTextBounds(text, 0, text.Length, r); 

    //Manual scaling using DisplayMetrics due to Android 
    //issues for compatibility with older versions 
    Android.Util.DisplayMetrics metrics = new Android.Util.DisplayMetrics(); 
    GetDisplay.GetMetrics(metrics); 

    return new System.Drawing.SizeF(r.Width(), r.Height() * metrics.Density); 
} 

कहाँ f.DrawingFont एक Androdid.Text.TextPaint GetDisplay है:

private Display GetDisplay() 
{ 
    return this.GetSystemService(Android.Content.Context.WindowService).JavaCast<Android.Views.IWindowManager>().DefaultDisplay; 
} 

और जावा में एक ही विधि है:

private Display getDisplay() { 
    return ((WindowManager) getContext().getSystemService(
      Context.WINDOW_SERVICE)).getDefaultDisplay(); 
} 
+0

आप कर रहे हैं सुधार, हमेशा लागू किया जाता है और कैनवास में एक स्केलिंग मूल्य भरपाई नहीं हो पाती नहीं? मैं वास्तव में नहीं सोचता कि बाध्यकारी आय की गणना गलत है, लेकिन फ़ॉन्ट प्रतिपादन कोड कैनवास स्केलिंग के अनुसार उचित फ़ॉन्ट आकार नहीं चुनता है ... –

+0

हां, यह हमेशा गणना की जाती है कि स्केलिंग के बिना टेक्स्ट आयामों की आवश्यकता होती है कैनवास। –

+0

इसका उल्लेख करना भूल गया है इसका उपयोग ज्यादातर कैनवास में पाठ की स्थिति के लिए किया जाता है, सटीक आयामों और स्थिति को जानना आवश्यक है। –