Нарисуйте один и тот же круг на одном и том же изображении на двух разных устройствах (разная плотность экрана)

У меня есть изображение на двух разных устройствах с разным размером экрана и плотностью.

Используя холст, я хочу нарисовать круг на изображении устройства A, затем отправить координаты центра на устройство B и нарисовать круг в том же положении, даже если одно и то же изображение имеет другой размер.

Что я делаю на устройстве A перед отправкой координаты x, так это:

float density = getResources().getDisplayMetrics().density;
int width = getWidth();
float inchesLength = width/density;
float scaledXCenter = xCenter / inchesLength;

Я делаю то же самое для координаты y.

На устройстве B я получаю те же параметры и умножаю полученную координату на длину в дюймах:

float density = getResources().getDisplayMetrics().density;
int width = getWidth();
float inchesLength = width/density;
float restoredXCenter = scaledXCenter * inchesLength;

Я тестирую это на AVD. Проблема в том, что каждый AVD имеет плотность экрана 1, даже если я ясно вижу, что на меньшем устройстве (устройство A) то же самое изображение отображается полностью, но занимает меньше места!

Должен ли этот подход работать при работе на реальных устройствах?

Есть ли лучший способ сделать это?


person Vincenzo Pii    schedule 29.12.2011    source источник


Ответы (1)


найдите ширину и высоту холста и, разделив ширину и высоту, найдите соотношение. Это соотношение следует умножать на каждое значение

Вот пример кода

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.view.View;

public class GameCanvas extends View {
    private Paint paint = new Paint();
    private float canvasWidth;
    private float canvasHeight;
    private float ratio;

    public GameCanvas(Context context) {
        super(context);
        // TODO Auto-generated constructor stub
    }

    public void onDraw(Canvas canvas) {
        canvasWidth = canvas.getWidth();
        canvasHeight = canvas.getHeight();
        ratio=canvasWidth/canvasHeight;

        paint.setColor(Color.BLACK);
        paint.setStrokeWidth(3);
        //canvas.drawRect(30*ratio, 30*ratio, 100*ratio, 200*ratio, paint);
        paint.setStrokeWidth(0);
        paint.setColor(Color.CYAN);
        canvas.drawRect(33*ratio, 60*ratio, 77*ratio, 77*ratio, paint);
        paint.setColor(Color.YELLOW);
        canvas.drawRect(33*ratio, 33*ratio, 77*ratio, 60*ratio, paint);

    }
}
person Community    schedule 10.04.2012