Код показывает, как можно что-либо нарисовать на Android.
В качестве элемента для рисования беру ImageView, который занимает весь экран.
В activity_main.xml это:
<ImageView
android:id="@+id/imageView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_centerVertical="true"
android:layout_centerHorizontal="true"
/>
В основном коде задача следующая:
1. Очистить экран.
2. Вывести сообщение по центру экрана.
3. Сообщение должно быть длиной с половину экрана - размер фонта подстраивается под это.
Вот сам код:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Получу геометрию экрана
WindowManager wm = (WindowManager) getBaseContext().getSystemService(Context.WINDOW_SERVICE);
Display display = wm.getDefaultDisplay();
Point size = new Point();
display.getSize(size);
final int screenWidth = size.x;
final int screenHeight = size.y;
ImageView imageView = (ImageView) this.findViewById(R.id.imageView);
// Создаю bitmap, на котором рисую
Bitmap bitmap = Bitmap.createBitmap(screenWidth,screenHeight,Bitmap.Config.ARGB_4444);
Canvas canvas = new Canvas(bitmap);
Paint paint = new Paint();
paint.setAntiAlias(true);
// Подменяю ImageView своим изображением
imageView.setImageBitmap(bitmap);
// Очищаю изображение
paint.setColor(Color.WHITE);
canvas.drawRect(0f, 0f, (float) screenWidth, (float) screenHeight, paint);
paint.setColor(Color.BLUE);
String message = "Hello, world";
// Устанавливаю размер сообщения на половину ширины экрана.
// и получаю размеры прямоугольника, который ограничивает это сообщение.
Rect bounds = setTextSizeForWidth(paint,screenWidth/2,message);
// w - получившийся размер текста по горизонтали
float w = paint.measureText(message);
canvas.drawText(message, (screenWidth - w) / 2, (screenHeight + bounds.height()) / 2, paint);
}
/**
* Этот метод подгонки размера шрифтов нашёл в Интернете
* Добавил сюда возврат Rect, чтобы дополнительно знать высоту текста
* @param paint
* @param desiredWidth
* @param text
* @return Rect of message with desired width
*/
private static Rect setTextSizeForWidth(Paint paint, float desiredWidth,
String text) {
// Pick a reasonably large value for the test. Larger values produce
// more accurate results, but may cause problems with hardware
// acceleration. But there are workarounds for that, too; refer to
// http://stackoverflow.com/questions/6253528/font-size-too-large-to-fit-in-cache
final float testTextSize = 48f;
// Get the bounds of the text, using our testTextSize.
paint.setTextSize(testTextSize);
Rect bounds = new Rect();
paint.getTextBounds(text, 0, text.length(), bounds);
// Calculate the desired size as a proportion of our testTextSize.
float desiredTextSize = testTextSize * desiredWidth / bounds.width();
// Set the paint for that size.
paint.setTextSize(desiredTextSize);
// Detect bounds of resulting string
paint.getTextBounds(text, 0, text.length(), bounds);
return bounds;
}
}