j2me zmiana czcionki

0

korzstam z tabeli stworzonej za pomoca Canvas
http://www.jappit.com/uploads/src/j2me_canvas_table_src.zip

niestety zmiana atrybutow czcionki nie zmienia nic w widoku - nadal jest tego samego rozmiaru na telefonie...
chodzi mi o zamiane w pliku
ScrollableTable.java

linii:
Font font = Font.getDefaultFont();
na:
Font font = Font.getFont(Font.FACE_PROPORTIONAL, Font.STYLE_PLAIN, Font.SIZE_SMALL);

nie zmienia to rozmiaru czcionki chodziaz ta pierwsze z pewnoscia nie okresla jej jako 'mala'

0

z defaultowymi czcionkami na komorkach to jest taka lipa, ze na kazdym modelu czcionka jest inna. Dawno sie nie bawiłem czcionkami, ale z tego co pamietam, przy zmianie wyglądu czcionki systemowej, rowniez nie kazda kombinacja mi działała. Najlepszym chyba rozwiazaniem to stworzyc swoja własna czcionke(*jakis obrazek z literkami). Przynajmniej w grach to sie sprawdzic powinno.(niedlugo bede to robic dla siebie, to zdam relacje)

0

spox a w przeciagu jakiego czasu (tylko orientacyjnie) bedziesz sie tym zajmowal?

0

wsumie mozna powiedziec ze od wczoraj zaczełem sie zajmowac tym problemem ;)

0

ja tez na dniach zaczne bede informowal o postepach i bylbym wdzieczny jezeli Ty tez bedziesz, pozdro

0

jak tam jakies efekty? skompletowalem sobie materialy i siadam do tego bo czcionka jest ogromna... zbyt ogromna

0

Efektów jeszcze nie ma. na razie przygotowałem sobie tylko plik ong z czcionka. Mam ostry zapierdziel w pracy wiec nie mam czasu. Jak juz cos bede miał to dam znać

0

A wiec jako ze weeekend miałem troche czasu to juz zrobiłem własna czcionke. Wszystko udało mi sie umieścic w 1 klasie, kilka metod + 2 pliki - jeden z literkami(plik png) a drugi z wspolrzednymi literek.. Teraz samiast drawString uzywam swojej metody, i napis wyswietla mi moją czcionka a nie systemowa. Dodatkowo moge pobrac szerokosc( w pixelach) kazdego Strigna, wysokość czcionki, i takei tam podstawy. A tobie jak poszło?

0

znalazlem klase ktorej podaje plik .ttf i pisze ta czcionka (!)

0

tylko ciekawe czy dla ttf mozna podmieniac palety, jak to ma miejsce dla png. I ciekawe tez, ile cięższy(albo i lżejszy) bedzie plik tff, no i czy to szybko bedzie rysowac, jezeli bede chciał wyswietlic np. 50 liter.
Ja zostane przy swojej opcji, szczególnie ze juz jest zrobiona ;).
Daj znac jak działa ta twoja klasa, bo jestem ciekawy.

EDIT:

csh zastanów się nad sensem uzywania tej klasy. Sprawdziłem tak an szybko, i plik png z moja czcionką waży ok 20kb, a taka sama czcionka zapisana jako ttf wazy 200kb, czyli 10x wiecej, a zapewne wiesz, ze 180 kb na komorki to dosyc duża roznica. poza tym, dla plikow ttf niemozna podmienic palety, czyli chcac miec 2 kolory czcionki juz masz zajete 400 kb, gdzie przy plikach png i pliku z paleta ten sam zabieg uzyskasz majac ok 22 kb ;)

0

klasa jest tu http://www.getjar.com/products/13938/J2MEttfexamplemidlet
a musze korzystac bo nie mam wyjscia, terminy gonią a z tym png to jak widac po Tobie troche schodzi nad tym a nie mam luzow czasowych

pozdrawiam :)

0

csh zastanów się nad sensem uzywania tej klasy. Sprawdziłem tak an szybko, i plik png z moja czcionką waży ok 20kb, a taka sama czcionka zapisana jako ttf wazy 200kb, czyli 10x wiecej, a zapewne wiesz, ze 180 kb na komorki to dosyc duża roznica. poza tym, dla plikow ttf niemozna podmienic palety, czyli chcac miec 2 kolory czcionki juz masz zajete 400 kb, gdzie przy plikach png i pliku z paleta ten sam zabieg uzyskasz majac ok 22 kb ;)
masz racje [wstyd] okazuje sie ze na niektore modele 200kb to max wielkosc JARa, a jak mi tyle wazy sam ttf to juz program sie nie zmiesci :) czy jest dla Ciebie duzym problemem podeslac mi Twoje rozwiazanie do testow wydajnosci na maila? jezeli nie to spox rozumiem

0

źródła ci nie dam, bo kod ten bedzie uzyty w mojej pracy inzynierskiej. Ale jezeli chcesz, to moge napisac ci mniej wiecej jak się do tego problemu zabrac. Albo na forum, albo na gg ci wytlumacze, wybór pozostawiam tobie ;)

0

ok jezeli to bedzie w miare proste zeby od reki napisac to byloby fajowo
a nie myslales zrobic z tego biblioteki ? (bez zrodel same .class)

0

Hejka.
Widze ze dalej masz problem z uzywaniem własnych bitmapowych czcionek, wiec po krótce opisze jak ja to zrobiłem.

Po pierwsze potrzebujesz 2 plików. Jeden to plik czcionka.png a drugi np. wspolrzedne.txt albo jakas binarka

czcionka.png - w tym pliku robisz sobie obrazek ze wszystkimi literkami/znakami jakie chcesz uzywac w swoim programie. Najlepiej zeby wszystkie znaki były w jednej lini.
wspolrzedne.txt - tutaj zapisujesz wspolrzedne x oraz szerokosc literki.

A teraz kodzik.

Tworzysz sobiejakas tablice char[], w której wrzucasz zaki, które masz w pliku graficznym. Znaki podajesz w takiej kolejnosci w jakiej sa w tym pliku czcionka.png

Tworzysz sobie obiekt Hashtable do którego wrzucasz znaki z tablicy char[] oraz index na którym ta literka sie znajduje.

Nastepnie wczytujesz do jakiejs tablicy wspolrzedne kazdej z literek. Ja zrobiłem tablice dwuwymiarową tablica[iloscZnakow][2], gdzie w drugim wymiarze miałem zapisana pozycje x literki oraz jej szerokosc.

Mając te dane wystarczy napisac metode która rysuje dany znak.
Po pierwsze dajesz g.setClip(x,y,szerokoscLiterki, wysokoscLiterki). - dane masz w tablicy[][]
Nastepnie rysujesz obrazek czcionka.png, tyle ze wspolrzędna X przesuwasz o wartosc z tablicy[][]czyli np. g.drawImage(czcionka,-121,5,Graphics.LEFT|Graphics.TOP);

kozystajac z Hashtable wiesz, w ktorym indexie w tablicy ze wspolrzednymi jest dana literka.

Nastepnie pozostaje ci napisanie metody, ktora rysuje całę wyrazy.

Podejrzewam, ze moze nie do konca prosto to wytłumaczyłem. Jak masz jakies pytania to pisz.

0

samos ma bardzo dobry pomysł.

Tylko po co aż tyle informacji?
Nie wystarczy Ci tylko szerokość kolejnych literek? Wysokość jest stała a x,y wyliczysz z poprzednich szerokości literek, wysokości czcionki i szerokości png.

A zamiast Hashtable proponuję 2 tablice. Jedną z szerokościami literek a drugą z kolejnymi literkami.

0

a jak z wydajnością?
cos w stylu tego? :

import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;

public class customfont extends MIDlet {

    customfontCanvas m_canvas;
    Display disp;

    public void startApp() {

        disp = Display.getDisplay(this);
        m_canvas = new customfontCanvas(this);
        disp.setCurrent(m_canvas);
    }

    public void pauseApp() {
    }

    public void destroyApp(boolean unconditional) {
    }
}
import javax.microedition.lcdui.*;
import java.util.*;
import java.io.*;
import java.io.InputStreamReader;

public class customfontCanvas extends Canvas implements Runnable {

    customfont midlet;
    Thread gameThread;
    Image font = null;
    byte[] charWidth = {
        2, 6, 2, 5, 2, 2, 2, 2, 4, 4, 5, 4, 6, 3, 5, 4, 2, 4, 5, 3, 5, 5, 6, 5, 5, 5, 5, 5, 8, 9, 5, 3, 3,
        4, 4, 7, 6, 7, 7, 8, 5, 6, 6, 6, 5, 6, 6, 2, 5, 6, 5, 8, 6, 6, 5, 6, 6, 5, 6, 6, 8, 10, 6, 6,
        7, 6, 5, 5, 5, 5, 5, 4, 5, 5, 2, 3, 5, 2, 8, 5, 5, 5, 5, 4, 5, 4, 5, 6, 6, 5, 6, 4, 8, 8, 8, 8, 8, 6,
        6, 6, 6, 3, 3, 5, 4, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 3, 3, 5, 4, 5, 5, 5,
        5, 5, 5, 5, 6, 5, 5, 5, 2, 4, 4, 9, 9,
    };
    byte[] charHeight = {9, 9, 11, 11, 10, 9, 10, 4, 8, 8, 9, 5, 9, 7, 7, 9, 10, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 11, 9,
        11, 11, 11, 11, 9, 10, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
        9, 9, 11, 9, 9, 9, 9, 9, 9, 11, 9, 9, 11, 9, 9, 9, 9, 9, 11, 11, 9, 9, 9, 9, 9, 9, 9, 11, 9, 9, 9, 9, 9,
        9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 12, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
        9, 9, 9, 9, 9, 12, 9, 9, 8, 8, 9, 9,
    };
    short[] fontX = {0, 2, 8, 10, 15, 17, 19, 21, 23, 27, 31, 36, 40, 46, 49, 54, 58, 60, 64, 69, 72, 77, 82, 88, 93, 98, 103, 108, 113, 121, 130, 135, 138, 141, 145, 149,
        156, 162, 169, 176, 184, 189, 195, 201, 207, 212, 218, 224, 226, 231, 237, 242, 250, 0, 6, 11, 17, 23, 28, 34, 40, 48, 58, 64, 70, 77, 83, 88, 93, 98,
        103, 108, 112, 117, 122, 124, 127, 132, 134, 142, 147, 152, 157, 162, 166, 171, 175, 180, 186, 192, 197, 203, 207, 215, 223, 231, 239, 247, 253,
        0, 6, 12, 15, 18, 23, 27, 33, 39, 45, 51, 57, 63, 69, 75, 81, 87, 93, 98, 103, 108, 113, 118, 123, 128, 133, 138, 141, 144, 149, 153, 158, 163, 168,
        173, 178, 183, 188, 194, 199, 204, 209, 211, 215, 219, 228
    };
    short[] fontY = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
        0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
        0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
        0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
        0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
        0, 0, 0,
        12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
        12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
        12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
        12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
        12, 12, 12, 12, 12, 12,
        24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
        24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
        24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
        24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
        24, 24, 24, 24, 24, 24
    };
    String[] hex_value = {"21", "3f", "a1", "bf", "2c", "2e", "3b", "27", "3c", "3e", "23", "2a", "2b", "2d", "3d", "2f", "7c", "5c", "30", "31",
        "32", "33", "34", "35", "36", "37", "38", "39", "a9", "40", "df", "5b", "5d", "28", "29", "ac", "24", "26", "25", "41", "42", "43",
        "44", "45", "46", "47", "48", "49", "4a", "4b", "4c", "4d", "4e", "4f", "50", "51", "52", "53", "54", "55", "56", "57", "58", "59",
        "5a", "5f", "61", "62", "63", "64", "65", "66", "67", "68", "69", "6a", "6b", "6c", "6d", "6e", "6f", "70", "71", "72", "73",
        "74", "75", "76", "77", "78", "79", "7a", "c1", "c0", "c2", "c3", "c4", "c9", "c8", "ca", "cb", "cd", "cc", "ce", "cf", "d3", "d2", "d4",
        "d5", "d6", "da", "d9", "db", "dc", "c7", "d1", "e1", "e0", "e2", "e3", "e4", "e9", "e8", "ea", "eb", "ed", "ec", "ee", "ef", "f3", "f2", "f4",
        "f5", "f6", "fa", "f9", "fb", "fc", "e7", "f1", "3a", "20", "a0", "8c", "9c", "00"
    };
    int j = 0;
    String[] MAIN_MENU = {"kkkkkkkk", "Infotech", "@#$%^&*"};

    /**
     * constructor
     */
    public customfontCanvas(customfont m_Midlet) {
        midlet = m_Midlet;


        try {

            font = Image.createImage("/new_font.png");
            gameThread = new Thread(this);
            gameThread.start();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void run(String s) {

        repaint();
// readfile(String s);

    }

    /**
     * paint
     */
    public void paint(Graphics g) {

        drawMenu(g);

    }

    public void drawMenu(Graphics g) {

        g.setColor(0xffffff);
        g.fillRect(0, 0, getWidth(), getHeight());
        g.setColor(0);
        try {
            int y = 50;
            for (int i = 0; i <= MAIN_MENU.length; i++) {
                drawString1(g, MAIN_MENU[i], getWidth() / 3 - MAIN_MENU[i].length(), y, 0);
                y += 20;
            }

        } catch (Exception e) {
            System.out.println("error ");
        }

    }

    void drawString1(Graphics g, String s, int xPos, int yPos, int anc) {
        String s1 = new String(s);

        System.out.println(s1);

// short word;
        try {
            for (int i = 0; i < s1.length(); i++) {
// get current character
                char c = s1.charAt(i);
                System.out.println("c -" + c); // kris
// get ordinal value or ASCII equivalent

                int cIndex = (int) c;
                System.out.println("cIndex -" + cIndex);
                String hex = Integer.toHexString(cIndex);

                System.out.println("hex- " + hex);

                for (j = hex_value.length - 1; j >= 0; j--) {
                    if (hex_value[j].equals(hex)) {
                        System.out.println("j-" + j);

                        if (cIndex >= 33 && cIndex <= 255) {
                            int w1 = charWidth[cIndex - 33];
                            System.out.println("charwidth-" + w1);
                            int w2 = charHeight[(cIndex - 33)];
                            System.out.println("charheight-" + w2);
                            setImage(g, xPos, yPos, font, fontX[(j)], fontY[(j)], charWidth[(j)], charHeight[(j)], 0);
                            System.out.println("fontX[j+1]= " + fontX[j + 1]);

                            xPos += charWidth[(j)];

                            System.out.println("xpos-" + xPos);
//}//for loop krishnan

                        }
                    }
                }
            }
        } catch (Exception e) {
            System.out.println("error in draw");
        }

    }

    static void setImage(Graphics g, int xPos, int yPos, Image img, int cutX, int cutY, int width, int height, int anc) {
        g.setClip(xPos, yPos, width, height);
        g.drawImage(img, xPos - cutX, yPos - cutY, 0);
    }

    public void run() {
    }
}
0

p123 - Hashtable daje mi taka mozliwosc ze jako argument podaje jakas literke i ona i zwraca index w ktorym znajduja sie dane o tej literce(czyli x i szerokosc). A zapisanei szerokosci kazdej literki jest jak dla mine lepszym rozwiazaniem, niz sprawdzanie x mojej literki, potem sprawdzanie x kolejnej literki i na koncu odejmowanie tych wartosci. Teraz za jednym zamahem pobieram x i szerokosc i juz moge rysowac.

csh - jak bedziesz miał literki w jednej lini, to nie bedziesz musiał miec tablicy font y oraz charHeight. No i nie widze sensu zamiany char na ASCII, skoro docelowo chcesz i tak narysowac char. A jesli chodzi o wydajnosc, to jakis specjalnych badan i obliczen nie robiłem, ale aplikacja przez to nie jest spowalniana.

0

samos - Jeśli masz takie same indexy w tablicy z literkami i szerokościami(współrzędnymi X skoro tak się upierasz) nie potrzebujesz hashtable.

Jeśli char 'r' znajduje się na n-tej pozycji to niech jej szerokosc(X) znajduje sie też na n-tej pozycji w tablicy szerokości.
Na mój gust przekombinowane. Unikaj hashtable w j2me!

csh - Twoja klasa jest przekombinowana... W j2me trzeba pisać krótko i prosto. Po co Ci wysokości czcionek?! [???] Czy wszystkie literki nie powinny byc tej samej wysokości? Ach jeszcze jedno. Napisz sobie metodę zwracającą długość stringa w pixelach. Bardzo przydatne przy pozycjonowaniu tekstów na ekranie.

Pozdrawiam i życzę powodzenia.

0
p123 napisał(a)

samos - Jeśli masz takie same indexy w tablicy z literkami i szerokościami(współrzędnymi X skoro tak się upierasz) nie potrzebujesz hashtable.

Jeśli char 'r' znajduje się na n-tej pozycji to niech jej szerokosc(X) znajduje sie też na n-tej pozycji w tablicy szerokości.

No ale skad mam wiedziec na której pozycji jest char 'r' ? To tego potrzeba mi hashtable. A czy x i szerokosc bede miałw tablicy dwuwymiarowej, czy w dwóch tablicah jednowymiarowych - to juz jak komu wygodniej.

0

Wystarczy że w tym samym indeksie masz literkę 'r' i jej szerokość. I na prawdę nie potrzebujesz X tylko szerokości. Przejrzenie poprzednich wartości tablicy z szerokościami nie jest pamięciożerne i bardzo proste żeby wyliczyć X na obrazku z literkami. Wystarczą tylko 2 tablice. Zaoszczędzasz nieco miejsca.

Pozdrawiam

0

Skąd masz wiedzieć na jakiej pozycji jest 'r'? Tablica.indexOf('r') i tyle.

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