Java ME Canvas üzerinde resim ortalamak

____________________________________________________________________

Jave ME uygulamalarında örneğin açılış ekranında (SplashScreen) ekranda bir resim göstermek isteyebilirsiniz. Uygulamanın farklı çözünürlüklerde ekranlara sahip olacağını düşünüp bu resmi tam ekran görünecek birşey değil de ekranın ortasında farklı çözünürlüklerde kırpılmadan veya kaymadan görünecek bir resim olacak şekilde seçersiniz. Sonra da bunu ortalamaya kalkarsınız ki teoride çok basittir. 🙂 Pratikte de basittir ama ortaokul matematiğini ne kadar öğrendiğimin ispatı X ile Y’yi karıştırınca işler değişiyor. 🙂

Canvas yönteminde resmi çizmek için kullandığımız metot Graphics.drawImage(resim_yolu, int X, int Y, int dayanak noktası);

Canvas üzerine çizilecek resmi ortalamak için ekranın eni ve boyutu en için getWidth() ve boy için; de getHeight() metotları ile alınır. Resmi ortalamak için metodumuza X ve Y değerleri ekranın ortasını bulacak şekilde ikiye bölünerek girilir, tabi bu cihaza bağlı bir değişken olduğu için yine getWidth() ve getHeight() metotlarından aldığımız değeri ikiye böleceğiz. Daha sonra da metodumuza hesapladığımız alanda seçtiğimiz resim dosyasının tam ortasını getirecek şekilde dayanak noktamızı gireriz. Bu da Graphics.VCENTER|Graphics.HCENTER yazarak elde ederiz. Yani resim ortalama metodumuz şöyle birşey olur:

Graphics.drawImage(“resim_yolu.png”, getWidth()/2, getHeight/2, Graphics.VCENTER|Graphics.HCENTER);

Benim de az önce dikkatsizliğim sebebiyle yaptığım yanlışlık da bu metotta genişlik ile yüksekliğin yerlerini karıştırmamdı. Bundan sonra tabi grafik tuhaf yerlerde çıkmaya başladı. Ben de metodun sonuna gidip Graphics.VCENTER|Graphics.HCENTER kısmına gelebilecek ne varsa yazmaya başladım denemek için; Graphics.VCENTER|Graphics.LEFT, Graphics.TOP|Graphics.HCENTER vs. gittim. Tabi yükseklik ve genişlik ile ilgili hatayı farketmem uzun sürdü. 🙂

Bu kadar saçmaladım bari bir kod da koyayım tam olsun. Aşağıdaki kod ekranı beyaza boyayan bir tuval (Canvas sınıfı) yaratır ve bunun tam ortasına tam ortasından tuttuğu bir resmi koyar. 🙂 Aşağıda ekran görüntüsü var.


import javax.microedition.midlet.MIDlet;
import javax.microedition.lcdui.*;public class ResimOrtalama extends MIDlet implements CommandListener{
private Display ekran;
private Command cikis = new Command("Çıkış", Command.EXIT, 1);protected void startApp() {
Canvas canvas = new Tuval();
ekran = Display.getDisplay(this);
canvas.addCommand(cikis);
canvas.setCommandListener(this);
ekran.setCurrent(canvas);
}protected void pauseApp() {
}protected void destroyApp(boolean unconditional) {
}public void commandAction(Command komut, Displayable d) {
if(komut == cikis)destroyApp(true);notifyDestroyed();
}
}
class Tuval extends Canvas {
public void paint(Graphics g) {
int genislik = getWidth();
int yukseklik = getHeight();

try {
Image resim = Image.createImage("/resim.png");
g.setColor(0xffffff);
g.fillRect(0, 0, genislik, yukseklik);
g.drawImage(resim, genislik/2, yukseklik/2, Graphics.VCENTER | Graphics.HCENTER);
} catch (Exception ex) {
g.setColor(0xffffff);
g.fillRect(0, 0, genislik, yukseklik);
g.setColor(0x0f000f);
g.drawString("Resim yüklenemedi!", 0, 0, Graphics.TOP | Graphics.LEFT);
//Not: Az önceki olayda da Graphics.TOP | Graphics.LEFT çizimin ekranın üst
//kısmından ve yazının sol tarafından yapılmasını söylüyor
return;
}
}
}

ResimOrtalama MIDlet ekran görüntüsü

ResimOrtalama MIDlet ekran görüntüsü

Yandaki yukarıdaki kodun örnek sonucudur(Grafik dosyasını kendiniz ekleyin. 🙂 ) Dikkatsizlik demişken geçen gün sınavımda da farklı bir dikkatsizlik ürünü sergiledim. Sınav sorularımızda Mary Shelley’in Frankenstein romanında canavar karakterimiz bir gölde boğulmak olan bir kızı kurtarıyor ve bunu düzgün göremeyen bazı tanıklar canavarın kıza saldırdığını sanıyor ve canavarı vuruyor. Başka bir kısımda da canavar kendisini yaratan Victor adlı kahramanımızdan bir dişi canavar yaratmasını istiyor. Sınavdaki soruda da bu iki durumdan ilki vardı, dedim tamam bu doğru, ama ikinci şıkka bakınca bu da doğru dedim. Halbuki anlamam sınavdan çıkışımdan sonra olsa ve iş işten geçmiş olsa da gerçeği fark ettim, soruda Victor’ın canavara bir eş yapma  teklifinden bahsediliyordu. Ben işte burada dikkatsizlik yapıp ikisi de doğru diye bir yanılgıya kapılıp ustalıkla yanlış şıkkın yuvarlağını doldurdum. 🙂 Bir yerde de interdental anlamı olarak dil ucu ve üst diş bildiğim ve içimden tekrar ettiğim halde ben alt diş ve üst dudak (labiodental) yaptım, nasıl oldu bunu hiç anlamadım ama. 😀