/* * Copyright (C) 2007 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.example.android.apis.graphics; import android.content.Context; import android.graphics.*; import android.os.Bundle; import android.view.*; public class TextAlign extends GraphicsActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(new SampleView(this)); } private static class SampleView extends View { private Paint mPaint; private float mX; private float[] mPos; private Path mPath; private Paint mPathPaint; private static final int DY = 30; private static final String TEXT_L = "Left"; private static final String TEXT_C = "Center"; private static final String TEXT_R = "Right"; private static final String POSTEXT = "Positioned"; private static final String TEXTONPATH = "Along a path"; private static void makePath(Path p) { p.moveTo(10, 0); p.cubicTo(100, -50, 200, 50, 300, 0); } private float[] buildTextPositions(String text, float y, Paint paint) { float[] widths = new float[text.length()]; // initially get the widths for each char int n = paint.getTextWidths(text, widths); // now popuplate the array, interleaving spaces for the Y values float[] pos = new float[n * 2]; float accumulatedX = 0; for (int i = 0; i < n; i++) { pos[i*2 + 0] = accumulatedX; pos[i*2 + 1] = y; accumulatedX += widths[i]; } return pos; } public SampleView(Context context) { super(context); setFocusable(true); mPaint = new Paint(); mPaint.setAntiAlias(true); mPaint.setTextSize(30); mPaint.setTypeface(Typeface.SERIF); mPos = buildTextPositions(POSTEXT, 0, mPaint); mPath = new Path(); makePath(mPath); mPathPaint = new Paint(); mPathPaint.setAntiAlias(true); mPathPaint.setColor(0x800000FF); mPathPaint.setStyle(Paint.Style.STROKE); } @Override protected void onDraw(Canvas canvas) { canvas.drawColor(Color.WHITE); Paint p = mPaint; float x = mX; float y = 0; float[] pos = mPos; // draw the normal strings p.setColor(0x80FF0000); canvas.drawLine(x, y, x, y+DY*3, p); p.setColor(Color.BLACK); canvas.translate(0, DY); p.setTextAlign(Paint.Align.LEFT); canvas.drawText(TEXT_L, x, y, p); canvas.translate(0, DY); p.setTextAlign(Paint.Align.CENTER); canvas.drawText(TEXT_C, x, y, p); canvas.translate(0, DY); p.setTextAlign(Paint.Align.RIGHT); canvas.drawText(TEXT_R, x, y, p); canvas.translate(100, DY*2); // now draw the positioned strings p.setColor(0xBB00FF00); for (int i = 0; i < pos.length/2; i++) { canvas.drawLine(pos[i*2+0], pos[i*2+1]-DY, pos[i*2+0], pos[i*2+1]+DY*2, p); } p.setColor(Color.BLACK); p.setTextAlign(Paint.Align.LEFT); canvas.drawPosText(POSTEXT, pos, p); canvas.translate(0, DY); p.setTextAlign(Paint.Align.CENTER); canvas.drawPosText(POSTEXT, pos, p); canvas.translate(0, DY); p.setTextAlign(Paint.Align.RIGHT); canvas.drawPosText(POSTEXT, pos, p); // now draw the text on path canvas.translate(-100, DY*2); canvas.drawPath(mPath, mPathPaint); p.setTextAlign(Paint.Align.LEFT); canvas.drawTextOnPath(TEXTONPATH, mPath, 0, 0, p); canvas.translate(0, DY*1.5f); canvas.drawPath(mPath, mPathPaint); p.setTextAlign(Paint.Align.CENTER); canvas.drawTextOnPath(TEXTONPATH, mPath, 0, 0, p); canvas.translate(0, DY*1.5f); canvas.drawPath(mPath, mPathPaint); p.setTextAlign(Paint.Align.RIGHT); canvas.drawTextOnPath(TEXTONPATH, mPath, 0, 0, p); } @Override protected void onSizeChanged(int w, int h, int ow, int oh) { super.onSizeChanged(w, h, ow, oh); mX = w * 0.5f; // remember the center of the screen } } }