วาดวงกลมเดียวกันบนภาพเดียวกันบนอุปกรณ์สองเครื่องที่แตกต่างกัน (ความหนาแน่นของหน้าจอต่างกัน)

ฉันมีรูปภาพบนอุปกรณ์สองเครื่องที่มีขนาดหน้าจอและความหนาแน่นต่างกัน

ฉันต้องการวาดวงกลมบนอุปกรณ์ 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