1

アプリケーションに次のようなものを実装したいと考えています。ここに画像の説明を入力 つまり、各画像には 1 つのハート アイコンが含まれています。ハートクリックでクリックイベントを処理したいのですが、そのために次のコードがあります

list.setEmptyString("No Image Available", DrawStyle.HCENTER);
            list.setRowHeight(Display.getHeight() - 100);
            list.setSize(data.size());
            if (listVManager != null && listVManager.getFieldCount() > 0) {
                listVManager.deleteAll();
            }

            list.setCallback(new ListFieldCallback() {
                public void drawListRow(ListField list, Graphics graphics,
                        int index, int y, int w) {
                    int yPos = y + list.getRowHeight() - 1;
                    graphics.setColor(0x434343);
                    graphics.fillRect(0, y, w, list.getRowHeight());

                    if (logoThumbnailImage != null
                            && logoThumbnailImage.length > index
                            && logoThumbnailImage[index] != null) {
                        EncodedImage img = logoThumbnailImage[index];
                        graphics.drawImage(0, y + 10, Display.getWidth(),
                                Display.getHeight() - 100, img, 0, 0, 0);

                        graphics.drawText("Hello", 10,
                                Display.getHeight() - 150);
                        graphics.drawImage(Display.getWidth() - 70,
                                Display.getHeight() - 150 + 300,
                                heart.getWidth(), heart.getHeight(), heart,
                                0, 0, 0);
                    } else {
                        graphics.drawImage(
                                15,
                                y + 10,
                                Display.getWidth(),
                                Display.getHeight() - 100,
                                sizeImage(iconImage, Display.getWidth(),
                                        Display.getHeight() - 100), 0, 0, 0);

                    }

                    graphics.drawText("Hello", 10,
                            Display.getHeight() - 150);
                    graphics.drawLine(0, yPos, w, yPos);

                }

                public Object get(ListField listField, int index) {
                    return null;
                }

                public int getPreferredWidth(ListField listField) {
                    return Display.getWidth();
                }

                public int indexOfList(ListField listField, String prefix,
                        int start) {
                    return 0;
                }
            });
            listVManager.add(list);
            loadImages = new LoadImages(80, 80);
            loadImages.start();
        }
    });

ここで、画像の読み込みは、画像をバックグラウンドで読み込み、logoThumbnailImage 配列に保存し、画像の読み込み時にそこからリストを無効にするスレッドです。

Load image スレッド クラス:

private class LoadImages extends Thread {

    int widthL;
    int heightL;
    LoadImages(int width, int height) {
        this.widthL = width;
        this.heightL = height;
    }

    public void run() {
        logoThumbnailImage=new EncodedImage[numberOfItem];
        if (object != null) {
            for (int i = 0; i < numberOfItem; i++) {                
                    try {
                        String text=object[i].getJSONArray("UrlArray").getString(0).toString();
                        EncodedImage encodedImg = JPEGEncodedImage.encode(connectServerForImage(text), quality);    //connectserverForImage load Images from server                     
                        logoThumbnailImage[i] = sizeImage(encodedImg, Display.getWidth(), Display.getHeight()-100);
                        list.invalidate();


                } catch (Exception e) 
                {
                        e.printStackTrace();
                    }

            }
        } else {
            UiApplication.getUiApplication().invokeLater(new Runnable() {
                public void run() {
                    Dialog.alert("No Data Found");
                }
            });
        }
    }
}

アプリケーションはスムーズに実行されますが、次の出力が得られました。 ここに画像の説明を入力

次の問題があります 1.ハートと説明がリストの1行にしか表示されません。私が欠けているものを教えてもらえますか?2. ハートでクリックイベントを実行する方法

4

1 に答える 1

3

これを簡単に見てみると、問題は、drawListRow() メソッドに渡される「y」位置を無視していることにあるようです。

        public void drawListRow(ListField list, Graphics graphics,
                int index, int y, int w) {

事実上、現在の行 (int インデックスを使用して識別される行) を描画するために使用する必要がある「キャンバス」は、四角形 (0、y、w、list.getRowHeight()) によって囲まれています。

実際には、ListField に属する範囲内のどこにでもペイントできます。つまり、ペイントできる領域は、実際には長方形 (0, 0, list.getWidth(), list.getHeight()) です。これはできますが、すべきではありません。行の四角形の外に出ると、別の行を塗りつぶすことになります。

あなたの場合、選択した行の外側をペイントすることは、まさにあなたのコードが行うことです。これをして:

                graphics.drawText("Hello", 10,
                        Display.getHeight() - 150);

これは実際には ListField の左から 10 ピクセル、上から 150 ピクセル下の Display.getHeight() に配置されます。ペイントしている行に関係なく、ListField のこの時点に配置されます。したがって、すべての行で Hello テキストが同じ場所に配置されます。

したがって、drawListRow() をコーディングするときは、すべての位置をオフセットして、描画する行の境界内に収まるようにしてください。ペイントしている領域の原点は (0, y) であるため、y を使用してすべての垂直位置をオフセットします。Display.getHeight() を使用しないでください。list.getRowHeight() を使用して、ペイントできる高さ (y から開始) を取得してください。また、Display.getWidth() を使用しないでください。渡された w 変数を使用して幅を取得してください。あなたが描くことができること。すべてのグラフィック アクションは、これらの境界内で発生する必要があります。

于 2013-10-09T17:52:50.893 に答える