Android - przesunięcie elementów grafiki względem siebie

0

Witam

Rysuję na "canvasie" linię oraz ikonę - środek ikony wyznacza ta rysowana linia:

public void onDraw(Canvas canvas){

    Bitmap rotate = BitmapFactory.decodeResource(getResources(), R.drawable.ledlightblue);

    Paint paint = new Paint();
    paint.setAntiAlias(true);
    paint.setStrokeWidth(2f);
    paint.setColor(Color.BLACK);
    paint.setStyle(Paint.Style.STROKE);
    paint.setStrokeJoin(Paint.Join.ROUND);

    canvas.drawLine(100, 100, 100, 200, paint);

    canvas.drawBitmap(rotate, 84, 100, null);

}

Mam 3 fizyczne urządzenia marki Samsung do testów tj.: Galaxy ACE, Galaxy Tab 3 7' (T211) oraz Galaxy Tab 3 8' (T311).

Na dwóch pierwszych rysowana linia przebiega dokładnie przez środek rysowanej ikony, a na trzecim urządzeniu jest rysowana kilka pixeli wcześniej.

Dlaczego tak się dzieje i jak się pozbyć tego problemu?

0

Po pierwsze metoda onDraw musi być bardzo szybko wykonywana, więc inicjalizację paint i bitmapy przenieś do konstruktora. Opisany przez Ciebie efekt dzieje się dlatego, że urządzenia mają różną rozdzielczość. Jeżeli chcesz uzyskać taki sam efekt na różnych urządzeniach pobierasz wymiary widoku za pomocą getMeasuredheight() i getMeasuredWidth() i np. dzielisz przez 3 (wtedy widok będzie zawsze w tym samym miejscu na każdym ekranie).

0

Ale ACE i Tab 3 7', też mają rożne rozdzielczości, a wyświetla dobrze?

Wiem o co chodzi z inicjacją w konstruktorze - przeniosłem do metody OnDraw żeby pokazać jak są inicjowane i co.

getMeasuredheight() i getMeasuredWidth() - nie za bardzo rozumiem o co chodzi z tymi metodami? Używam getWidth() i getHeight() do przeskalowania - zwracają to samo co powyższe metody.

Nie chodzi mi o to aby procentowo rysowany obraz względem fizycznego ekranu znajdował się zawsze w tym samym miejscu.
Chodzi o to, że dla podanego przykładu położenie obrazka względem linii się zmienia - rozumiem, że linia i obrazek mogą być w różnych miejscach fizycznego obrazu, ale względem siebie to już nie rozumiem.

0

Nie ma żadnego ale, to że akurat dobrze wygląda to na tych urządzeniach to jest czysty przypadek. Podajesz dane "na twardo" w fomie ilości pikseli, tak się nie robi. Nigdzie nie możesz wpisywać liczb na twardo, musisz wszystko wymierzyć, odpowiednio przeskalować jeżeli jest taka potrzeba i automatycznie dopasować do każdego ekranu.
Wersja krótka:

        float startX,startY,endX,endY; 
        float left,top;
        canvas.drawLine(startX, startY, endX, endY, paint);
        canvas.drawBitmap(rotate, left, top, null); //left,top to lewy górny róg bitmapy

Tam gdzie są wpisane liczby mają być podane wymiary obliczone na podstawie szerokości i wysokości ekranu, wielkości bitmapy.

0

Tak też robię (wyliczam wszystko - nic na sztywno - podałem na sztywno pixele dla uproszczenia). Może wklejana bitmapa jest przeskalowywana (choć w zasobach mam tylko ją ustawioną dla drawable-mdpi) i "punkt środkowy" różnie wypada - muszę sprawdzić ten trop.

0

Ok dzięki za podpowiedzi: problem polegał na tym, że dodałem bitmapę o rozmiarze 32x32 pixele i operowałem w programie takim rozmiarem, a tymczasem bitmapa została przeskalowana - wystarczyło skorzystać z metod getWidt() i getHeight() dla bitmapy. Faktycznie dla dwóch urządzeń prawidłowość wyświetlania wynikała z przypadku, a może raczej z tych samych proporcji ekranu.

1 użytkowników online, w tym zalogowanych: 0, gości: 1