Gambarlah lingkaran yang sama pada gambar yang sama di dua perangkat berbeda (kepadatan layar berbeda)

Saya memiliki gambar di dua perangkat berbeda dengan ukuran dan kepadatan layar berbeda.

Dengan menggunakan kanvas, saya ingin menggambar lingkaran pada gambar perangkat A, kemudian mengirimkan koordinat pusat ke perangkat B, dan menggambar lingkaran pada posisi yang sama, meskipun gambar yang sama memiliki ukuran yang berbeda.

Yang saya lakukan pada perangkat A sebelum mengirimkan koordinat x adalah sebagai berikut:

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

Saya melakukan hal yang sama untuk koordinat y.

Di perangkat B, saya mendapatkan parameter yang sama dan mengalikan koordinat yang diterima dengan inciPanjang:

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

Saya sedang menguji ini pada AVD. Masalahnya adalah setiap AVD memiliki kepadatan layar 1, meskipun saya dapat melihat dengan jelas bahwa pada perangkat yang lebih kecil (perangkat A), gambar yang sama ditampilkan sepenuhnya, tetapi menempati ruang yang lebih kecil!

Haruskah pendekatan ini berhasil saat bekerja pada perangkat nyata?

Apakah ada cara yang lebih baik untuk melakukannya?


person Vincenzo Pii    schedule 29.12.2011    source sumber


Jawaban (1)


carilah lebar dan tinggi kanvas dan dengan membagi lebar dan tinggi carilah perbandingannya. Rasio ini harus dikalikan dengan setiap nilai

Berikut adalah contoh kodenya

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