পেইন্ট.টেক্সটবাউন্ডস () সহ কেন্দ্র :
private Rect r = new Rect();
private void drawCenter(Canvas canvas, Paint paint, String text) {
canvas.getClipBounds(r);
int cHeight = r.height();
int cWidth = r.width();
paint.setTextAlign(Paint.Align.LEFT);
paint.getTextBounds(text, 0, text.length(), r);
float x = cWidth / 2f - r.width() / 2f - r.left;
float y = cHeight / 2f + r.height() / 2f - r.bottom;
canvas.drawText(text, x, y, paint);
}
পেইন্ট.এলাইন.সেন্টার মানে এই নয় যে পাঠ্যের রেফারেন্স পয়েন্টটি উল্লম্বভাবে কেন্দ্রিক। রেফারেন্স পয়েন্টটি সর্বদা বেসলাইনে থাকে। সুতরাং, কেন পেইন্ট.আলাইন.এলএফটি ব্যবহার করবেন না ? আপনাকে যাইহোক রেফারেন্স পয়েন্ট গণনা করতে হবে।
পেইন্ট.ডেসেন্ট () এর অসুবিধা রয়েছে, এটি আসল পাঠটিকে বিবেচনা করে না। পেইন্ট.ডেসেন্ট () পাঠ্যের উত্থানের সাথে অক্ষর রয়েছে কিনা তা নির্বিশেষে একই মানটি পুনরুদ্ধার করে। এজন্য আমি পরিবর্তে আর.বটম ব্যবহার করি ।
ক্যানভাস.জেটহাইট () এপিআই <16 এর সাথে আমার কিছু সমস্যা হয়েছে That's এজন্য আমি এর পরিবর্তে ক্যানভাস.সেটলিপবাউন্ডস (রেক্ট) ব্যবহার করি। (না ব্যবহার করবেন Canvas.getClipBounds ()। GetHeight () যেমন একটি জন্য মেমরি বরাদ্দ আয়তক্ষেত্র ।)
পারফরম্যান্সের কারণে, ওনড্র () ব্যবহার করার আগে আপনাকে অবজেক্টগুলি বরাদ্দ করা উচিত । হিসাবে drawCenter () মধ্যে বলা হবে onDraw () বস্তুর আয়তক্ষেত্র R এখানে একটি ক্ষেত্র হিসেবে preallocated করা হয়।
আমি দুটি শীর্ষ উত্তরের কোডটি আমার নিজস্ব কোডে (আগস্ট 2015) রাখার চেষ্টা করেছি এবং ফলাফলগুলির তুলনা করার জন্য একটি স্ক্রিনশট তৈরি করেছি:
পাঠ্যটি লাল ভরাট আয়তক্ষেত্রের মাঝখানে হওয়া উচিত। আমার কোডটি সাদা পাঠ্য উত্পাদন করে, অন্য দুটি কোড সম্পূর্ণ ধূসর পাঠ্য উত্পাদন করে (সেগুলি আসলে একই, ওভারল্যাপিং)) ধূসর পাঠ্যটি কিছুটা কম এবং ডানদিকে দুটি বেশি।
এইভাবে আমি পরীক্ষাটি করেছিলাম:
import android.app.Activity;
import android.content.Context;
import android.content.pm.ActivityInfo;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.RectF;
import android.graphics.Typeface;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;
class MyView extends View {
private static String LABEL = "long";
private static float TEXT_HEIGHT_RATIO = 0.82f;
private FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(0, 0);
private Rect r = new Rect();
private Paint paint = new Paint();
private Paint rectPaint = new Paint();
public MyView(Context context) {
super(context);
}
private void drawTextBounds(Canvas canvas, Rect rect, int x, int y) {
rectPaint.setColor(Color.rgb(0, 0, 0));
rectPaint.setStyle(Paint.Style.STROKE);
rectPaint.setStrokeWidth(3f);
rect.offset(x, y);
canvas.drawRect(rect, rectPaint);
}
// andreas1724 (white color):
private void draw1(Canvas canvas, Paint paint, String text) {
paint.setTextAlign(Paint.Align.LEFT);
paint.setColor(Color.rgb(255, 255, 255));
canvas.getClipBounds(r);
int cHeight = r.height();
int cWidth = r.width();
paint.getTextBounds(text, 0, text.length(), r);
float x = cWidth / 2f - r.width() / 2f - r.left;
float y = cHeight / 2f + r.height() / 2f - r.bottom;
canvas.drawText(text, x, y, paint);
drawTextBounds(canvas, r, (int) x, (int) y);
}
// Arun George (light green color):
private void draw2(Canvas canvas, Paint textPaint, String text) {
textPaint.setTextAlign(Paint.Align.CENTER);
textPaint.setColor(Color.argb(100, 0, 255, 0));
int xPos = (canvas.getWidth() / 2);
int yPos = (int) ((canvas.getHeight() / 2) - ((textPaint.descent() + textPaint.ascent()) / 2));
canvas.drawText(text, xPos, yPos, textPaint);
}
// VinceStyling (light blue color):
private void draw3(Canvas yourCanvas, Paint mPaint, String pageTitle) {
mPaint.setTextAlign(Paint.Align.LEFT);
mPaint.setColor(Color.argb(100, 0, 0, 255));
r = yourCanvas.getClipBounds();
RectF bounds = new RectF(r);
bounds.right = mPaint.measureText(pageTitle, 0, pageTitle.length());
bounds.bottom = mPaint.descent() - mPaint.ascent();
bounds.left += (r.width() - bounds.right) / 2.0f;
bounds.top += (r.height() - bounds.bottom) / 2.0f;
yourCanvas.drawText(pageTitle, bounds.left, bounds.top - mPaint.ascent(), mPaint);
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
int margin = 10;
int width = w - 2 * margin;
int height = h - 2 * margin;
params.width = width;
params.height = height;
params.leftMargin = margin;
params.topMargin = margin;
setLayoutParams(params);
paint.setTextSize(height * TEXT_HEIGHT_RATIO);
paint.setAntiAlias(true);
paint.setTypeface(Typeface.create(Typeface.SERIF, Typeface.BOLD_ITALIC));
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawColor(Color.rgb(255, 0, 0));
draw1(canvas, paint, LABEL);
draw2(canvas, paint, LABEL);
draw3(canvas, paint, LABEL);
}
}
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
FrameLayout container = new FrameLayout(this);
container.setLayoutParams(new ViewGroup.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.MATCH_PARENT));
container.addView(new MyView(this));
setContentView(container);
}
}