অ্যান্ড্রয়েড পেইন্ট: .মেজারটেক্সট () বনাম .getTextBounds ()


191

আমি পাঠ্যটি ব্যবহার করে মাপছি Paint.getTextBounds(), যেহেতু আমি লেখার উচ্চতা এবং প্রস্থ উভয়ই রেন্ডার করতে আগ্রহী। যাইহোক, আসল টেক্সট অনুষ্ঠিত সবসময় একটু বেশি চওড়া হয় .width()এর Rectদ্বারা ভর্ত্তি তথ্য getTextBounds()

আমার অবাক করে দিয়েছি, আমি পরীক্ষা করে .measureText()দেখেছি যে এটি আলাদা (উচ্চতর) মান দেয়। আমি চেষ্টা করে দেখেছি এবং এটি সঠিক খুঁজে পেয়েছি।

কেন তারা বিভিন্ন প্রস্থের রিপোর্ট করে? আমি কীভাবে উচ্চতা এবং প্রস্থটি সঠিকভাবে পেতে পারি? আমি বোঝাতে চাইছি, আমি ব্যবহার করতে পারি.measureText() তবে তারপরে .height()ফিরে আসা লোকদের উপর আমার বিশ্বাস করা উচিত কিনা তা আমি জানতে পারি না getTextBounds()

অনুরোধ হিসাবে, সমস্যাটি পুনরুত্পাদন করার জন্য এখানে ন্যূনতম কোড রয়েছে:

final String someText = "Hello. I believe I'm some text!";

Paint p = new Paint();
Rect bounds = new Rect();

for (float f = 10; f < 40; f += 1f) {
    p.setTextSize(f);

    p.getTextBounds(someText, 0, someText.length(), bounds);

    Log.d("Test", String.format(
        "Size %f, measureText %f, getTextBounds %d",
        f,
        p.measureText(someText),
        bounds.width())
    );
}

আউটপুটটি দেখায় যে পার্থক্যটি কেবলমাত্র 1 এর চেয়ে বেশি (এবং শেষ মুহুর্তের কোনও রাউন্ডিং ত্রুটি নয়) আকারে বাড়তে পারে বলে মনে হয় (আমি আরও সিদ্ধান্তে পৌঁছতে চলেছি, তবে এটি সম্পূর্ণ ফন্ট-নির্ভর হতে পারে):

D/Test    (  607): Size 10.000000, measureText 135.000000, getTextBounds 134
D/Test    (  607): Size 11.000000, measureText 149.000000, getTextBounds 148
D/Test    (  607): Size 12.000000, measureText 156.000000, getTextBounds 155
D/Test    (  607): Size 13.000000, measureText 171.000000, getTextBounds 169
D/Test    (  607): Size 14.000000, measureText 195.000000, getTextBounds 193
D/Test    (  607): Size 15.000000, measureText 201.000000, getTextBounds 199
D/Test    (  607): Size 16.000000, measureText 211.000000, getTextBounds 210
D/Test    (  607): Size 17.000000, measureText 225.000000, getTextBounds 223
D/Test    (  607): Size 18.000000, measureText 245.000000, getTextBounds 243
D/Test    (  607): Size 19.000000, measureText 251.000000, getTextBounds 249
D/Test    (  607): Size 20.000000, measureText 269.000000, getTextBounds 267
D/Test    (  607): Size 21.000000, measureText 275.000000, getTextBounds 272
D/Test    (  607): Size 22.000000, measureText 297.000000, getTextBounds 294
D/Test    (  607): Size 23.000000, measureText 305.000000, getTextBounds 302
D/Test    (  607): Size 24.000000, measureText 319.000000, getTextBounds 316
D/Test    (  607): Size 25.000000, measureText 330.000000, getTextBounds 326
D/Test    (  607): Size 26.000000, measureText 349.000000, getTextBounds 346
D/Test    (  607): Size 27.000000, measureText 357.000000, getTextBounds 354
D/Test    (  607): Size 28.000000, measureText 369.000000, getTextBounds 365
D/Test    (  607): Size 29.000000, measureText 396.000000, getTextBounds 392
D/Test    (  607): Size 30.000000, measureText 401.000000, getTextBounds 397
D/Test    (  607): Size 31.000000, measureText 418.000000, getTextBounds 414
D/Test    (  607): Size 32.000000, measureText 423.000000, getTextBounds 418
D/Test    (  607): Size 33.000000, measureText 446.000000, getTextBounds 441
D/Test    (  607): Size 34.000000, measureText 455.000000, getTextBounds 450
D/Test    (  607): Size 35.000000, measureText 468.000000, getTextBounds 463
D/Test    (  607): Size 36.000000, measureText 474.000000, getTextBounds 469
D/Test    (  607): Size 37.000000, measureText 500.000000, getTextBounds 495
D/Test    (  607): Size 38.000000, measureText 506.000000, getTextBounds 501
D/Test    (  607): Size 39.000000, measureText 521.000000, getTextBounds 515

আপনি [আমার উপায়] [1] দেখতে পাচ্ছেন। যে অবস্থান এবং সঠিক সীমা পেতে পারেন। [1]: স্ট্যাকওভারফ্লো.com
অ্যালেক্স চি

এই প্রশ্নের অন্যান্য দর্শনার্থীদের জন্য পাঠ্য মাপার পদ্ধতি সম্পর্কে সম্পর্কিত ব্যাখ্যা explanation
সুরগাচ

উত্তর:


370

এই জাতীয় সমস্যাটি পরিদর্শন করতে আমি যা করেছি তা করতে পারেন:

অ্যান্ড্রয়েড উত্স কোড, পেইন্ট.জাভা উত্স অধ্যয়ন করুন, পরিমাপের পাঠ্য এবং গেটটেক্সাউন্ডস উভয় পদ্ধতি দেখুন। আপনি শিখতে পারবেন যে পরিমাপের পাঠটি নেটিটি_মিজারটেক্সটকে কল করে এবং গেটটেক্সটবাউন্ডস নেটিগেটস্ট্রিংবাউন্ডসকে কল করে, যা সি ++ এ প্রয়োগ করা দেশীয় পদ্ধতি।

সুতরাং আপনি পেইন্ট.পি.পি. পড়া চালিয়ে যাবেন, যা উভয়ই প্রয়োগ করে।

নেটিভ_মিজার টেক্সট -> স্কেপেইন্টগ্লু :: পরিমাপের পাঠ্যক্রম_সিআইআই

নেটিজিটস্ট্রিংবাউন্ডস -> স্কপেইন্টগ্লু :: গেটস্ট্রিংবাউন্ডস

এখন আপনার গবেষণাটি পরীক্ষা করে দেখায় যে এই পদ্ধতিগুলির মধ্যে পার্থক্য রয়েছে। কিছু প্যারাম চেক করার পরে, উভয় কল করে স্কাইপেন্ট :: স্কাইয়া লিবিতে মাপের পাঠ্য (অ্যান্ড্রয়েডের অংশ), তবে তারা উভয়ই আলাদা ওভারলোড হওয়া ফর্মটি কল করে।

স্কিয়াতে আরও খনন করে, আমি দেখতে পাচ্ছি যে উভয় কল একই ফাংশনে একই গণনায় ফলিত হয়, কেবল ভিন্নভাবে ফলাফল দেয়।

আপনার প্রশ্নের উত্তর দিতে: আপনার উভয় কল একই গণনা করে। ফলাফলের সম্ভাব্য পার্থক্যটি সত্য যে গেটটেক্সটবাউন্ডসটি পূর্ণসংখ্যার হিসাবে সীমা ফেরত দেয়, যখন মেজারটেক্সট ফ্লোট মান দেয়।

সুতরাং আপনি যা পান তা ফ্লোটকে ইনট-এ রূপান্তর করার সময় গোলাকৃতির ত্রুটি হয় এবং এটি SkPaintGlue :: পেইন্টকপি-তে ঘটে যায় SkRect :: রাউন্ডআউট ফাংশন করার জন্য ডাকে T

এই দুটি কলের গণিত প্রস্থের মধ্যে পার্থক্য সর্বাধিক 1 হতে পারে।

সম্পাদনা 4 অক্টোবর 2011

ভিজ্যুয়ালাইজেশনের চেয়ে ভাল আর কী হতে পারে। আমি চেষ্টা করেছি, নিজের অন্বেষণের জন্য, এবং যোগ্য অনুগ্রহের জন্য :)

এখানে চিত্র বর্ণনা লিখুন

এটি হরফ আকার 60০, লাল রঙের সীমানা আয়তক্ষেত্র, বেগুনি রঙে পরিমাপের ফলাফল।

এটি দেখা গেছে যে সীমানা বাম অংশটি বাম থেকে কিছু পিক্সেল শুরু করে এবং মাপের পাঠের মানটি বাম এবং ডান উভয় দিকে এই মান দ্বারা বাড়ানো হয়। এটি গ্লাইফের অ্যাডভান্সএক্স মান নামে পরিচিত। (আমি এটি স্কাইপেনট.পি.পি.-এর স্কিয়ার উত্সগুলিতে আবিষ্কার করেছি)

সুতরাং পরীক্ষার ফলাফলটি হচ্ছে পরিমাপের পাঠ্য উভয় পক্ষের পাঠ্যে কিছু অগ্রিম মান যুক্ত করে, যখন getTextBouts ন্যূনতম সীমানাগুলি গণনা করে যেখানে দেওয়া পাঠ্যটি উপযুক্ত হবে।

আশা করি এই ফলাফলটি আপনার কাজে আসবে।

পরীক্ষার কোড:

  protected void onDraw(Canvas canvas){
     final String s = "Hello. I'm some text!";

     Paint p = new Paint();
     Rect bounds = new Rect();
     p.setTextSize(60);

     p.getTextBounds(s, 0, s.length(), bounds);
     float mt = p.measureText(s);
     int bw = bounds.width();

     Log.i("LCG", String.format(
          "measureText %f, getTextBounds %d (%s)",
          mt,
          bw, bounds.toShortString())
      );
     bounds.offset(0, -bounds.top);
     p.setStyle(Style.STROKE);
     canvas.drawColor(0xff000080);
     p.setColor(0xffff0000);
     canvas.drawRect(bounds, p);
     p.setColor(0xff00ff00);
     canvas.drawText(s, 0, bounds.bottom, p);
  }

3
মন্তব্য করতে এত দিন দেওয়ার জন্য দুঃখিত, আমি একটি ব্যস্ত সপ্তাহ ছিল। সি ++ কোডটি খনন করার জন্য সময় দেওয়ার জন্য ধন্যবাদ! দুর্ভাগ্যক্রমে, পার্থক্যটি 1 এর চেয়ে বেশি, এবং এটি গোলাকৃতির মানগুলি ব্যবহার করার পরেও দেখা যায় - যেমন টেক্সট আকারটি মাপের টেস্ট () = 263 এবং গেট টেক্সটবাউন্ডস () এর আকারে 29.0 এ সেট করা হয়। প্রস্থ = 260
স্লেজিকা

পেইন্ট সেটআপ এবং পরিমাপের সাথে দয়া করে ন্যূনতম কোড পোস্ট করুন, যা সমস্যার পুনরুত্পাদন করতে পারে।
পয়েন্টার নুল

আপডেট করা হয়েছে। বিলম্বের জন্য আবার দুঃখিত।
slezica

আমি এখানে ধনী সঙ্গে আছি। দুর্দান্ত গবেষণা! অনুগ্রহ সম্পূর্ণরূপে প্রাপ্য এবং সম্মানিত। আপনার সময় ও শ্রম জন্য আপনাকে ধন্যবাদ!
slezica

16
@ মাইস আমি এই প্রশ্নটি আবার খুঁজে পেয়েছি (আমি ওপি আছি)। আপনার উত্তরটি কী অবিশ্বাস্য ছিল তা আমি ভুলে গিয়েছিলাম। ভবিষ্যত থেকে ধন্যবাদ! আমি বিনিয়োগ করেছি সেরা 100rp!
slezica

21

এর সাথে আমার অভিজ্ঞতাটি হ'ল সেই getTextBoundsনিখুঁত ন্যূনতম বাউন্ডিং রেক্টটি ফেরত দেবে যা পাঠ্যকে আবৃত করে, রেন্ডারিংয়ের সময় প্রয়োজনীয় পরিমাপযোগ্য প্রস্থটি ব্যবহৃত হয় না। আমি এটিও বলতে চাই যে measureTextএকটি লাইন ধরেছে।

সঠিক পরিমাপের ফলাফল পাওয়ার জন্য আপনাকে StaticLayoutপাঠ্যটি রেন্ডার করতে এবং পরিমাপটি বের করতে হবে।

উদাহরণ স্বরূপ:

String text = "text";
TextPaint textPaint = textView.getPaint();
int boundedWidth = 1000;

StaticLayout layout = new StaticLayout(text, textPaint, boundedWidth , Alignment.ALIGN_NORMAL, 1.0f, 0.0f, false);
int height = layout.getHeight();

স্ট্যাটিকলআউট সম্পর্কে জানতেন না! getWidth () কাজ করবে না, এটি কেবলমাত্র আমি কাস্ট্রাক্টরে যা পাস করি তা ফিরিয়ে দেয় (যা widthনয়, maxWidth) তবে getLineWith () উইল করবে। আমি স্থিতিশীল পদ্ধতি getDesiredWidth () পেয়েছি, যদিও উচ্চতার সমতুল্য নেই। উত্তরটি সংশোধন করুন! এছাড়াও, আমি সত্যিই জানতে চাই কেন এতগুলি বিভিন্ন পদ্ধতি বিভিন্ন ফলাফল দেয়।
slezica

প্রস্থ সম্পর্কে আমার খারাপ। যদি আপনি এমন কিছু পাঠ্যের প্রস্থ চান যা একক লাইনে রেন্ডার করা হয়, তবে measureTextকাজটি সঠিকভাবে করা উচিত। অন্যথায়, যদি আপনি এই ধরনের হিসাবে প্রস্থ constaints (জেনো onMeasureবা onLayout, আপনি সমাধান আমি উপরের পোস্ট ব্যবহার করতে পারেন। আপনি স্বয়ংক্রিয় পুনরায় আকার দেওয়ার টেক্সট জানবেন যে সম্ভবতঃ করার চেষ্টা করছেন? এছাড়াও, কারণ টেক্সট সীমা সবসময় সামান্য কম, কারণ এটি কোনো চরিত্র প্যাডিং ব্যতিরেকে শুধু ক্ষুদ্রতম বেষ্টিত RECT অঙ্কনের জন্য প্রয়োজন ছিল।
চেজ

আমি প্রকৃতপক্ষে একটি টেক্সটভিউকে স্বয়ংক্রিয় আকার দেওয়ার চেষ্টা করছি। আমার উচ্চতাও প্রয়োজন, আমার সমস্যাগুলি এখানেই শুরু হয়েছিল! পরিমাপের প্রস্থ () অন্যথায় ভাল কাজ করে। এরপরে, আমি কেন আগ্রহী হয়েছি যে কেন বিভিন্ন পদ্ধতির বিভিন্ন মান দেয়
slezica

1
একটি বিষয় লক্ষণীয় হ'ল একটি পাঠ্যদর্শন যা মোড় করে এবং একটি মাল্টলাইন, প্রস্থের জন্য ম্যাচ_প্যারেন্টে পরিমাপ করবে এবং কেবল প্রয়োজনীয় প্রস্থ নয়, যা উপরের প্রস্থের পরমকে স্ট্যাটিকলআউটকে বৈধ করে তোলে। আপনাকে একটি পাঠ্য resizer প্রয়োজন হয়, তাহলে আমার পোস্ট চেক আউট stackoverflow.com/questions/5033012/...
চেজ

আমার একটি পাঠ্য সম্প্রসারণ অ্যানিমেশন থাকা দরকার এবং এটি একটি গুচ্ছকে সহায়তা করেছিল! ধন্যবাদ!
বাক্স

18

ইঁদুরের উত্তরটি দুর্দান্ত ... এবং এখানে আসল সমস্যার বর্ণনা দেওয়া হল:

সংক্ষিপ্ত সরল উত্তর হ'ল Paint.getTextBounds(String text, int start, int end, Rect bounds)রিটার্ন Rectযা শুরু হয় না (0,0)। এটি হ'ল পাঠ্যের প্রকৃত প্রস্থটি পাওয়া যাবে যা এর Canvas.drawText(String text, float x, float y, Paint paint)সাথে কল করে সেট করা হবে getTextBounds () থেকে একই পেইন্ট অবজেক্টের রেক্টের বাম অবস্থান যুক্ত করা উচিত। এরকম কিছু:

public int getTextWidth(String text, Paint paint) {
    Rect bounds = new Rect();
    paint.getTextBounds(text, 0, end, bounds);
    int width = bounds.left + bounds.width();
    return width;
}

এটি লক্ষ্য করুন bounds.left- এটি সমস্যার মূল চাবিকাঠি।

এইভাবে আপনি পাঠ্যের একই প্রস্থ পাবেন, যা আপনি ব্যবহার করে পাবেন Canvas.drawText()

এবং একই কাজটি heightপাঠ্য পাওয়ার জন্য হওয়া উচিত :

public int getTextHeight(String text, Paint paint) {
    Rect bounds = new Rect();
    paint.getTextBounds(text, 0, end, bounds);
    int height = bounds.bottom + bounds.height();
    return height;
}

PS: আমি এই সঠিক কোডটি পরীক্ষা করি নি, তবে ধারণার পরীক্ষা করেছি।


এই উত্তরে আরও অনেক বিস্তারিত ব্যাখ্যা দেওয়া আছে ।


2
রেক্ট সংজ্ঞা দেয় (বি। উইথথ) হতে (বি। রাইট-বি.ফেল্ট) এবং (বি.হাইট) হতে হবে (বি। বটম- বি.টপ)। অতএব আপনি (b.left + b.width) (b.right) এবং (b.bottom + b.height) (2 * b.bottom-b.top) এর সাথে প্রতিস্থাপন করতে পারেন তবে আমার মনে হয় আপনি চান ( পরিবর্তে b.bottom-b.top), যা (b.height) এর সমান। আমি মনে করি আপনি প্রস্থ সম্পর্কে সঠিক (সি ++ উত্স পরীক্ষা করার উপর ভিত্তি করে), গেটটেক্সটভিডথ () একই মানটি (বি। রাইট) প্রদান করে, কিছু গোলাকার ত্রুটি থাকতে পারে। (খ সীমানার একটি রেফারেন্স)
নুলানো

11

এই প্রশ্নের উত্তর দেওয়ার জন্য দুঃখিত ... আমার ছবিটি এম্বেড করা দরকার।

আমি মনে করি @ মাইস প্রাপ্ত ফলাফল মিসেলিডিং ading 60 টি ফন্টের আকারের জন্য পর্যবেক্ষণগুলি সঠিক হতে পারে তবে পাঠ্য ছোট হলে এগুলি অনেক বেশি পরিবর্তিত হয়। যেমন। 10px। সেক্ষেত্রে পাঠ্যটি আসলে সীমানার বাইরে টানা হয়।

এখানে চিত্র বর্ণনা লিখুন

স্ক্রিনশটের উত্সকোড:

  @Override
  protected void onDraw( Canvas canvas ) {
    for( int i = 0; i < 20; i++ ) {
      int startSize = 10;
      int curSize = i + startSize;
      paint.setTextSize( curSize );
      String text = i + startSize + " - " + TEXT_SNIPPET;
      Rect bounds = new Rect();
      paint.getTextBounds( text, 0, text.length(), bounds );
      float top = STEP_DISTANCE * i + curSize;
      bounds.top += top;
      bounds.bottom += top;
      canvas.drawRect( bounds, bgPaint );
      canvas.drawText( text, 0, STEP_DISTANCE * i + curSize, paint );
    }
  }

আহ, মিস্ট্রি টানছে। কৌতূহল না থাকলেও আমি এখনও এতে আগ্রহী। আপনি যদি অন্য কিছু খুঁজে পান তবে আমাকে জানাবেন!
slezica

আপনি যখন বলুন 20 এর একটি ফ্যাক্টর দ্বারা মাপতে চান ফন্টসাইজগুলি গুণান তখন সমস্যাটি কিছুটা প্রতিকার হতে পারে এবং এর ফলে ফলাফলকে ভাগ করার চেয়ে বেশি। কেবলমাত্র নিরাপদ দিকে থাকতে আপনি পরিমাপ করা আকারের আরও 1-2% প্রস্থ যুক্ত করতে চাইবেন। শেষ পর্যন্ত আপনার কাছে এমন পাঠ্য থাকবে যা দীর্ঘ হিসাবে পরিমাপ করা হয়েছে তবে কমপক্ষে কোনও পাঠ্য ওভারল্যাপিং নেই।
মরিটজ

6
বাউন্ডিং রেক্টরের ঠিক লেখার ভিতরে টেক্সট আঁকতে আপনাকে অবশ্যই এক্স = 0.0f দিয়ে টেক্সট আঁকতে হবে না কারণ বাউন্ডিং রেক্টর প্রস্থ এবং উচ্চতার মতো নয়, রেক্টের মতো ফিরে আসবে। এটিকে সঠিকভাবে আঁকতে আপনার "-bounds.left" মানের উপর X স্থানাঙ্কটি অফসেট করা উচিত, তবে এটি সঠিকভাবে প্রদর্শিত হবে।
রোমান

10

অস্বীকৃতি: এই সমাধানটি ন্যূনতম প্রস্থ নির্ধারণের ক্ষেত্রে 100% সঠিক নয়।

আমি ক্যানভাসে পাঠ্য কীভাবে পরিমাপ করতে পারি তাও নির্ধারণ করছিলাম। ইঁদুর থেকে দুর্দান্ত পোস্টটি পড়ার পরে মাল্টলাইন পাঠ্যটি কীভাবে পরিমাপ করা যায় সে সম্পর্কে আমার কিছু সমস্যা হয়েছিল। এই অবদানগুলি থেকে কোনও সুস্পষ্ট উপায় নেই তবে কিছু গবেষণা করার পরে আমি স্ট্যাটিকলআউট ক্লাস জুড়ে ক্যামে। এটি আপনাকে মাল্টলাইন পাঠ্য ("\ n" সহ পাঠ্য) মাপতে এবং সম্পর্কিত পেইন্টের মাধ্যমে আপনার পাঠ্যের আরও অনেকগুলি বৈশিষ্ট্য কনফিগার করতে সহায়তা করে।

মাল্টিলাইন পাঠ্য কীভাবে পরিমাপ করা যায় সে সম্পর্কে এখানে একটি স্নিপেট দেখানো হয়েছে:

private StaticLayout measure( TextPaint textPaint, String text, Integer wrapWidth ) {
    int boundedWidth = Integer.MAX_VALUE;
    if (wrapWidth != null && wrapWidth > 0 ) {
       boundedWidth = wrapWidth;
    }
    StaticLayout layout = new StaticLayout( text, textPaint, boundedWidth, Alignment.ALIGN_NORMAL, 1.0f, 0.0f, false );
    return layout;
}

আপনি যদি আপনার মাল্টলাইন পাঠ্যকে একটি নির্দিষ্ট প্রস্থে সীমাবদ্ধ করতে চান তবে র‌্যাপউইথটি নির্ধারণ করতে সক্ষম হয়।

যেহেতু স্ট্যাটিক্যালআউটআউট উইজথ () কেবল এই সীমাবদ্ধ প্রস্থকে ফেরত দেয় আপনি আপনার মাল্টলাইন পাঠ্য দ্বারা সর্বাধিক প্রস্থের জন্য প্রয়োজনীয় একটি পদক্ষেপ নিতে হবে। আপনি প্রতিটি রেখার প্রস্থ নির্ধারণ করতে সক্ষম হন এবং সর্বাধিক প্রস্থ অবশ্যই সর্বোচ্চ রেখার প্রস্থ:

private float getMaxLineWidth( StaticLayout layout ) {
    float maxLine = 0.0f;
    int lineCount = layout.getLineCount();
    for( int i = 0; i < lineCount; i++ ) {
        if( layout.getLineWidth( i ) > maxLine ) {
            maxLine = layout.getLineWidth( i );
        }
    }
    return maxLine;
}

আপনি কি igetLineWidth এ যাচ্ছেন না (আপনি কেবল প্রতিবার 0 পার করছেন)
ধনী এস

2

পাঠ্যের সীমাটি যথাযথভাবে পরিমাপ করার জন্য আরও একটি উপায় রয়েছে, প্রথমে আপনার বর্তমান পেইন্ট এবং পাঠ্যের পথ পাওয়া উচিত। আপনার ক্ষেত্রে এটির মতো হওয়া উচিত:

p.getTextPath(someText, 0, someText.length(), 0.0f, 0.0f, mPath);

এর পরে আপনি কল করতে পারেন:

mPath.computeBounds(mBoundsPath, true);

আমার কোডে এটি সর্বদা সঠিক এবং প্রত্যাশিত মানগুলি দেয়। তবে, এটি আপনার পদ্ধতির চেয়ে দ্রুত কাজ করে কিনা তা নিশ্চিত নয়।


পাঠ্যটির চারপাশে স্ট্রোকের রূপরেখা আঁকতে আমি যেভাবে যাইহোক getTextPath করছিলাম বলে আমি এটি দরকারী বলে মনে করি।
টুলমেকারস্টেভ

1

এর মধ্যে getTextBoundsএবং measureTextনীচের চিত্রটি সহ বর্ণিত।

সংক্ষেপে,

  1. getTextBoundsহ'ল সঠিক পাঠ্যের আরআরটিসিটি পাওয়া। measureTextপাঠ্যের দৈর্ঘ্য, বাম এবং ডান অতিরিক্ত ফাঁক সহ হয়।

  2. যদি পাঠ্যের মধ্যে ফাঁকা স্থান থাকে তবে measureTextএটি টেক্সটবাউন্ডগুলির দৈর্ঘ্য সহ মাপা হয় তবে এটি সমন্বিত স্থানান্তরিত হয়।

  3. পাঠ্যটি কাত হয়ে থাকতে পারে (স্কুও) বামে। এই ক্ষেত্রে, बाউন্ডিং বক্সের বাম দিকটি পরিমাপের পাঠ্যক্রমের পরিমাপের বাইরে হবে এবং পাঠ্যটির আবদ্ধের সামগ্রিক দৈর্ঘ্য এর চেয়ে বড় হবেmeasureText

  4. টেক্সটটি ঠিক কাত করা (স্কুও) করা যেতে পারে। এই ক্ষেত্রে, ডান দিকের সীমানা বাক্সটি পরিমাপের পাঠ্যক্রমের পরিমাপের বাইরে হবে এবং পাঠ্যটির আবদ্ধের সামগ্রিক দৈর্ঘ্য এর চেয়ে বড় হবেmeasureText

এখানে চিত্র বর্ণনা লিখুন


0

আমি প্রথম অক্ষরটির আসল মাত্রাগুলি এইভাবে গণনা করেছি (আপনি আপনার প্রয়োজন অনুসারে মেথড শিরোনামটি পরিবর্তন করতে পারেন, char[]ব্যবহারের পরিবর্তে String):

private void calculateTextSize(char[] text, PointF outSize) {
    // use measureText to calculate width
    float width = mPaint.measureText(text, 0, 1);

    // use height from getTextBounds()
    Rect textBounds = new Rect();
    mPaint.getTextBounds(text, 0, 1, textBounds);
    float height = textBounds.height();
    outSize.x = width;
    outSize.y = height;
}

নোট করুন যে আমি মূল পেইন্ট ক্লাসের পরিবর্তে টেক্সটপেইন্ট ব্যবহার করছি।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.