Paint.getTextBounds के साथ केंद्र () :
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);
}
Paint.Align.CENTER का मतलब यह नहीं है कि पाठ का संदर्भ बिंदु लंबवत केंद्रित है। संदर्भ बिंदु हमेशा आधार रेखा पर होता है। तो, Paint.Align.LEFT का उपयोग क्यों नहीं किया जाता है ? आपको वैसे भी संदर्भ बिंदु की गणना करनी होगी।
Paint.descent () का नुकसान है, कि यह वास्तविक पाठ पर विचार नहीं करता है। Paint.descent () उसी मान को पुनर्प्राप्त करता है, भले ही पाठ में अवरोही के साथ अक्षर हों या नहीं। इसलिए मैं इसके बजाय r.bottom का उपयोग करता हूं ।
मैं कुछ पड़ा है समस्याओं के साथ Canvas.getHeight () करता है, तो एपीआई <16. के कारण है कि मैं का उपयोग करें कि Canvas.getClipBounds (रेक्ट) के बजाय। ( Canvas.getClipBounds ()। GetHeight () का उपयोग न करें क्योंकि यह एक रेक्ट के लिए मेमोरी आवंटित करता है ।)
प्रदर्शन के कारणों के लिए, आपको ऑनड्रा () में उपयोग किए जाने से पहले ऑब्जेक्ट आवंटित करना चाहिए । के रूप में drawCenter () के भीतर बुलाया जाएगा OnDraw () वस्तु रेक्ट आर यहाँ एक क्षेत्र के रूप में पूर्व आबंटित किया गया है।
मैंने दो शीर्ष उत्तरों के कोड को अपने स्वयं के कोड (अगस्त 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);
}
}