首页 > 解决方案 > 如何在所有设备上正确显示 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);
        }

显示问题的屏幕截图:

在模拟器中运行应用程序

在物理设备上运行应用程序

标签: android

解决方案


推荐阅读