android - 如何在所有设备上正确显示 2d 图形?
问题描述
画布上描绘的形状是否可以在所有设备上正确显示?如何解决?在物理设备上运行应用程序(在 Android Studio 中实现)时,动画显示没有任何问题(图形对象不移动)。通过在模拟器中运行应用程序,形状会发生变化,相互叠加。存在与屏幕分辨率有关的问题(适应性问题)。我附上了演示问题的屏幕截图。 调用 onDraw()类方法开始绘图。以下是该项目的清单。
PS朋友,我是初学者。如果问题表述不正确,不要严格判断。
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
/* Не нужно загружать разметку в экран активности.
* Вместо неё мы загружаем свой класс, у которого
* есть холст для рисования. */
Draw draw = new Draw(this);
setContentView(draw);
}
}
public class Draw extends View {
/* Наследуемся от класса android.view.View,
* переопределяем метод класса onDraw(). */
public Draw(Context context) {
super(context);
}
// Создаем объект Paint, содержащий информацию о
// рисуемых объектах.
Paint paint = new Paint();
Rect rect = new Rect(); // Компоненты - числа типа int.
RectF rectF = new RectF(); // Компоненты - числа типа float.
Bitmap Bitmap;
Bitmap bitmapDogs;
Path path = new Path();
// Создаем массив точек для рисования Path.
Point[] PointPath = { new Point(150, 790), new Point(50, 960),
new Point(50, 1110), new Point(250, 1110),
new Point(250, 960), new Point(150, 790)};
@SuppressLint("DrawAllocation")
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
// 1. Закраска экрана.
// 1.1. Задаем цвет закрашивания
paint.setColor(Color.CYAN);
// 1.2. Выполняем закраску на канве.
canvas.drawPaint(paint);
// 2. Рисование двух линий
paint.setColor(Color.RED); // устанавливаем цвет
paint.setStrokeWidth(5); // устанавливаем толщину линии
// 2.1. Рисуем первую линию на канве.
canvas.drawLine(10, 10, 710, 10, paint);
paint.setColor(Color.BLACK); // устанавливаем цвет
// 2.2. Рисуем вторую линию на канве.
canvas.drawLine(10,20,710,20, paint);
// 3. Рисуем текст
paint.setTextSize(42); // устанавливаем размер шрифта
// 3.1. Рисуем текст.
canvas.drawText("Две линии", 120, 60, paint);
float cx = 95; // Координата x центра фигуры
float cy = 135; // Координата y центра фигуры
float a = 100; // Размер стороны прямоугольника (квадрата)
// или диаметр окружности
// 4. Рисование первой строки прямоугольников в режиме FILL
// 4.1. Устанавливаем сплошную заливку
paint.setStyle(Paint.Style.FILL);
// 4.2. Рисуем прямоугольники
DrawFigure(cx, cy, a, canvas);
cy += 125;
// 5. Рисование второй строки прямоугольников в режиме STROKE
// 5.1. Устанавливаем стиль без заливки
paint.setStyle(Paint.Style.STROKE);
// 5.2. Рисуем прямоугольники
DrawFigure(cx, cy, a, canvas);
...
// 8. Вывод на канву графического рисунка размером 150*150 пикс.
// 8.1 Получаем ресурсы
Resources res = this.getResources();
// 8.2. По идентификатору ресурсного графического файла,
// получаем Bitmap
Bitmap = BitmapFactory.decodeResource(res, R.drawable.malamute);
// 8.3. Выводим Bitmap на канву
canvas.drawBitmap(Bitmap, 200, 410, paint);
// 8.4. Выводим на канву текст
canvas.drawText("Аляскинский маламут", 120, 760, paint);
}
显示问题的屏幕截图:
解决方案
推荐阅读
- algorithm - 如何有效地在二进制数据框中找到模式?
- r - R:聚类算法的特殊要求
- java - 帕斯卡的三角递归 Java
- c - 在 C 中,他们无论如何都是逐行读取文件内容并将每个整数值(前行)分别存储到数组中的方式吗?
- javascript - 此选项标签中使用的技术是什么?
- mysql - 试图做不在的地方
- atom-editor - 如何在 atom 中增加终端字体大小
- android - 是否有任何选项可以在不启用计费帐户的情况下在 android 应用程序中尝试 Google Cloud Vision api 进行测试
- android - 通过 VoIP 进行音频呼叫的应用程序。
- pyspark - 如何将 PySpark 中的 DataFrame 输出保存到 TextFile?