152d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project/* 252d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project 352d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project * 452d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 552d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project * you may not use this file except in compliance with the License. 652d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project * You may obtain a copy of the License at 752d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project * 852d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 952d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project * 1052d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 1152d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 1252d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1352d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project * See the License for the specific language governing permissions and 1452d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project * limitations under the License. 1552d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project */ 1652d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project 1752d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Projectpackage com.example.android.apis.graphics; 1852d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project 1952d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Projectimport android.content.Context; 2052d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Projectimport android.graphics.*; 2152d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Projectimport android.os.Bundle; 2252d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Projectimport android.view.*; 2352d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project 2452d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Projectpublic class TextAlign extends GraphicsActivity { 2552d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project 2652d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project @Override 2752d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project protected void onCreate(Bundle savedInstanceState) { 2852d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project super.onCreate(savedInstanceState); 2952d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project setContentView(new SampleView(this)); 3052d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project } 3162e92d7a2a3fd2798901ec2e7c452ff0e4067163Christian Mehlmauer 3252d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project private static class SampleView extends View { 3352d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project private Paint mPaint; 3452d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project private float mX; 3552d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project private float[] mPos; 3662e92d7a2a3fd2798901ec2e7c452ff0e4067163Christian Mehlmauer 3752d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project private Path mPath; 3852d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project private Paint mPathPaint; 3962e92d7a2a3fd2798901ec2e7c452ff0e4067163Christian Mehlmauer 4052d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project private static final int DY = 30; 4152d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project private static final String TEXT_L = "Left"; 4252d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project private static final String TEXT_C = "Center"; 4352d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project private static final String TEXT_R = "Right"; 4452d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project private static final String POSTEXT = "Positioned"; 4552d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project private static final String TEXTONPATH = "Along a path"; 4662e92d7a2a3fd2798901ec2e7c452ff0e4067163Christian Mehlmauer 4752d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project private static void makePath(Path p) { 4852d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project p.moveTo(10, 0); 4952d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project p.cubicTo(100, -50, 200, 50, 300, 0); 5052d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project } 5162e92d7a2a3fd2798901ec2e7c452ff0e4067163Christian Mehlmauer 5252d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project private float[] buildTextPositions(String text, float y, Paint paint) { 5352d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project float[] widths = new float[text.length()]; 5452d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project // initially get the widths for each char 5552d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project int n = paint.getTextWidths(text, widths); 5652d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project // now popuplate the array, interleaving spaces for the Y values 5752d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project float[] pos = new float[n * 2]; 5852d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project float accumulatedX = 0; 5952d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project for (int i = 0; i < n; i++) { 6052d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project pos[i*2 + 0] = accumulatedX; 6152d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project pos[i*2 + 1] = y; 6252d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project accumulatedX += widths[i]; 6352d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project } 6452d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project return pos; 6552d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project } 6662e92d7a2a3fd2798901ec2e7c452ff0e4067163Christian Mehlmauer 6752d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project public SampleView(Context context) { 6852d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project super(context); 6952d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project setFocusable(true); 7062e92d7a2a3fd2798901ec2e7c452ff0e4067163Christian Mehlmauer 7152d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project mPaint = new Paint(); 7252d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project mPaint.setAntiAlias(true); 7352d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project mPaint.setTextSize(30); 7452d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project mPaint.setTypeface(Typeface.SERIF); 7562e92d7a2a3fd2798901ec2e7c452ff0e4067163Christian Mehlmauer 7652d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project mPos = buildTextPositions(POSTEXT, 0, mPaint); 7762e92d7a2a3fd2798901ec2e7c452ff0e4067163Christian Mehlmauer 7852d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project mPath = new Path(); 7952d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project makePath(mPath); 8052d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project 8152d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project mPathPaint = new Paint(); 8252d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project mPathPaint.setAntiAlias(true); 8352d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project mPathPaint.setColor(0x800000FF); 8452d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project mPathPaint.setStyle(Paint.Style.STROKE); 8552d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project } 8662e92d7a2a3fd2798901ec2e7c452ff0e4067163Christian Mehlmauer 8752d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project @Override protected void onDraw(Canvas canvas) { 8852d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project canvas.drawColor(Color.WHITE); 8952d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project 9052d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project Paint p = mPaint; 9152d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project float x = mX; 9252d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project float y = 0; 9352d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project float[] pos = mPos; 9462e92d7a2a3fd2798901ec2e7c452ff0e4067163Christian Mehlmauer 9552d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project // draw the normal strings 9652d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project 9752d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project p.setColor(0x80FF0000); 9852d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project canvas.drawLine(x, y, x, y+DY*3, p); 9952d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project p.setColor(Color.BLACK); 10062e92d7a2a3fd2798901ec2e7c452ff0e4067163Christian Mehlmauer 10152d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project canvas.translate(0, DY); 10252d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project p.setTextAlign(Paint.Align.LEFT); 10352d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project canvas.drawText(TEXT_L, x, y, p); 10452d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project 10552d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project canvas.translate(0, DY); 10652d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project p.setTextAlign(Paint.Align.CENTER); 10752d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project canvas.drawText(TEXT_C, x, y, p); 10852d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project 10952d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project canvas.translate(0, DY); 11052d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project p.setTextAlign(Paint.Align.RIGHT); 11152d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project canvas.drawText(TEXT_R, x, y, p); 11262e92d7a2a3fd2798901ec2e7c452ff0e4067163Christian Mehlmauer 11352d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project canvas.translate(100, DY*2); 11452d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project 11552d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project // now draw the positioned strings 11662e92d7a2a3fd2798901ec2e7c452ff0e4067163Christian Mehlmauer 11752d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project p.setColor(0xBB00FF00); 11852d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project for (int i = 0; i < pos.length/2; i++) { 11952d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project canvas.drawLine(pos[i*2+0], pos[i*2+1]-DY, 12052d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project pos[i*2+0], pos[i*2+1]+DY*2, p); 12152d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project } 12252d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project p.setColor(Color.BLACK); 12352d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project 12452d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project p.setTextAlign(Paint.Align.LEFT); 12552d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project canvas.drawPosText(POSTEXT, pos, p); 12662e92d7a2a3fd2798901ec2e7c452ff0e4067163Christian Mehlmauer 12752d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project canvas.translate(0, DY); 12852d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project p.setTextAlign(Paint.Align.CENTER); 12952d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project canvas.drawPosText(POSTEXT, pos, p); 13062e92d7a2a3fd2798901ec2e7c452ff0e4067163Christian Mehlmauer 13152d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project canvas.translate(0, DY); 13252d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project p.setTextAlign(Paint.Align.RIGHT); 13352d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project canvas.drawPosText(POSTEXT, pos, p); 13462e92d7a2a3fd2798901ec2e7c452ff0e4067163Christian Mehlmauer 13552d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project // now draw the text on path 13662e92d7a2a3fd2798901ec2e7c452ff0e4067163Christian Mehlmauer 13752d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project canvas.translate(-100, DY*2); 13852d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project 13952d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project canvas.drawPath(mPath, mPathPaint); 14052d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project p.setTextAlign(Paint.Align.LEFT); 14152d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project canvas.drawTextOnPath(TEXTONPATH, mPath, 0, 0, p); 14252d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project 14352d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project canvas.translate(0, DY*1.5f); 14452d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project canvas.drawPath(mPath, mPathPaint); 14552d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project p.setTextAlign(Paint.Align.CENTER); 14652d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project canvas.drawTextOnPath(TEXTONPATH, mPath, 0, 0, p); 14762e92d7a2a3fd2798901ec2e7c452ff0e4067163Christian Mehlmauer 14852d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project canvas.translate(0, DY*1.5f); 14952d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project canvas.drawPath(mPath, mPathPaint); 15052d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project p.setTextAlign(Paint.Align.RIGHT); 15152d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project canvas.drawTextOnPath(TEXTONPATH, mPath, 0, 0, p); 15252d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project } 15352d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project 15452d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project @Override 15552d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project protected void onSizeChanged(int w, int h, int ow, int oh) { 15652d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project super.onSizeChanged(w, h, ow, oh); 15752d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project mX = w * 0.5f; // remember the center of the screen 15852d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project } 15952d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project } 16052d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project} 16152d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project 162