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. 😀