I am working a UI based application in BlackBerry. UI is like the following:
label-1 : Oject choice field-1
label-2 : Oject choice field-2
label-3 : Oject choice field-3
label-4 : Oject choice field-4
label-5 : Oject choice field-5
It is really getting difficult to generate this UI. The width and height is the main issue for my difficulty.
public HomeScreen() {
super(MainScreen.USE_ALL_WIDTH | USE_ALL_HEIGHT | VERTICAL_SCROLL);
_dbOperations = new DBOperations();
_mainVFM = new VerticalFieldManager(VerticalFieldManager.USE_ALL_WIDTH);
_mainVFM.setMargin(10, 10, 40, 10);
_menuFieldVFM = new VerticalFieldManager();
_menuFieldVFM.setMargin(0, 5, 0, 0);
_menuDropDownVFM = new VerticalFieldManager();
((VerticalFieldManager) getMainManager()).setBackground(BackgroundFactory.createSolidBackground(Constants.BgColorCode));
XYEdges padding = new XYEdges(1, 1, 1, 1);
Border roundedBorder = BorderFactory.createSimpleBorder(padding);
// HEADING
_headingHFM = new HorizontalFieldManager(HorizontalFieldManager.USE_ALL_WIDTH);
_headingLabelField = new LabelField(Constants.Text_heading);
_headingLabelField.setFont(ApplicationFont.labelFont);
_headingHFM.add(_headingLabelField);
_headingHFM.setMargin(0, 0, 20, 0);
// _productLine LINE
_productLineLabelField = new LabelField(Constants.Text_ProductLine);
_productLineLabelField.setFont(ApplicationFont.explainationFont);
_productLineLabelField.setMargin(8, 0, 0, 0);
_menuFieldVFM.add(_productLineLabelField);
int plSetTo1 = 0;
_productLineOCF = new ObjectChoiceField("", _productLineArray, plSetTo1, Field.FIELD_RIGHT) {
protected void layout(int width, int height) {
setMinimalWidth(width - 60);
super.layout(width, height);
};
};
_productLineOCF.setFont(ApplicationFont.explainationFont);
_productLineOCF.setChangeListener(this);
_menuDropDownVFM.add(_productLineOCF);
// HP
_HPLabelField = new LabelField(Constants.Text_HP);
_HPLabelField.setFont(ApplicationFont.explainationFont);
_HPLabelField.setMargin(25, 0, 0, 0);
_menuFieldVFM.add(_HPLabelField);
int hpSetTo1 = 0;
String data_HP[] = { "Select HP" };
_HP_OCF = new ObjectChoiceField("", data_HP, hpSetTo1, Field.FIELD_RIGHT) {
protected void layout(int width, int height) {
setMinimalWidth(width - 60);
super.layout(width, height);
};
};
_HP_OCF.setFont(ApplicationFont.explainationFont);
_HP_OCF.setChangeListener(this);
_menuDropDownVFM.add(_HP_OCF);
_RPMLabelField = new LabelField(Constants.Text_RPM);
_RPMLabelField.setFont(ApplicationFont.explainationFont);
_RPMLabelField.setMargin(25, 0, 0, 0);
_menuFieldVFM.add(_RPMLabelField);
int rpmSetTo1 = 0;
String data_RPM[] = { "Select RPM" };
_RPM_OCF = new ObjectChoiceField("", data_RPM, rpmSetTo1, Field.FIELD_RIGHT) {
protected void layout(int width, int height) {
setMinimalWidth(width - 60);
super.layout(width, height);
};
};
_RPM_OCF.setChangeListener(this);
_menuDropDownVFM.add(_RPM_OCF);
// VOLTAGE
_voltageLabelField = new LabelField(Constants.Text_voltage);
_voltageLabelField.setFont(ApplicationFont.explainationFont);
_voltageLabelField.setMargin(25, 0, 0, 0);
_menuFieldVFM.add(_voltageLabelField);
int volSetTo1 = 0;
String data_voltage[] = { "Select Voltage" };
_voltageOCF = new ObjectChoiceField("", data_voltage, volSetTo1, Field.FIELD_RIGHT) {
protected void layout(int width, int height) {
setMinimalWidth(width - 60);
super.layout(width, height);
};
};
_voltageOCF.setChangeListener(this);
_menuDropDownVFM.add(_voltageOCF);
// FRAME SIZE
_frameSizeLabelField = new LabelField(Constants.Text_frameSize);
_frameSizeLabelField.setFont(ApplicationFont.explainationFont);
_frameSizeLabelField.setMargin(25, 0, 0, 0);
_menuFieldVFM.add(_frameSizeLabelField);
// int iSetTo1 = 0;
_frameSizeOCF = new ObjectChoiceField("", _frameArray, plSetTo1, Field.FIELD_RIGHT) {
protected void layout(int width, int height) {
setMinimalWidth(width - 60);
super.layout(width, height);
};
};
_frameSizeOCF.setChangeListener(this);
_menuDropDownVFM.add(_frameSizeOCF);
_menuMainHFM = new HorizontalFieldManager();
_menuMainHFM.add(_menuFieldVFM);
_menuMainHFM.add(_menuDropDownVFM);
// -OR- LABEL
_orLabelField = new LabelField(Constants.Text_or);
_orLabelField.setMargin(20, 0, 0, 0);
_orLabelField.setFont(ApplicationFont.labelFont);
// SEARCH BY PART NUMBER
_SearchByPartNumberField = new LabelField(Constants.Text_PartNoLabel);
_SearchByPartNumberField.setMargin(20, 0, 0, 0);
_SearchByPartNumberField.setFont(ApplicationFont.labelFont);
// ENTER PART NUMBER
_enterPartNoHFM = new HorizontalFieldManager();
_enterPartNoLabelField = new LabelField("Enter Part Number: ");
_partNumberEditField = new EditField();
_partNumberEditField.setBorder(roundedBorder);
_enterPartNoHFM.add(_enterPartNoLabelField);
_enterPartNoHFM.add(_partNumberEditField);
_enterPartNoHFM.setMargin(20, 0, 0, 0);
// SAERCH BUTTON
_searchButtonField = new ButtonField(" Search ", ButtonField.CONSUME_CLICK | ButtonField.FIELD_HCENTER);
_searchButtonField.setChangeListener(this);
_searchButtonField.setMargin(20, 0, 0, 0);
_checkForUpdates = new ButtonField(Constants.Button_checkForUpdates, ButtonField.CONSUME_CLICK | ButtonField.FIELD_HCENTER);
_checkForUpdates.setMargin(10, 0, 0, 0);
_checkForUpdates.setChangeListener(this);
_mainVFM.add(_headingHFM);
_mainVFM.add(_menuMainHFM);
_mainVFM.add(_orLabelField);
_mainVFM.add(_SearchByPartNumberField);
_mainVFM.add(_enterPartNoHFM);
_mainVFM.add(_searchButtonField);
_mainVFM.add(_checkForUpdates);
add(_mainVFM);
}
Now I am using following code. But no progress, I am at the same stage.
public HomeScreen() {
super(MainScreen.USE_ALL_WIDTH | USE_ALL_HEIGHT | VERTICAL_SCROLL);
_dbOperations = new DBOperations();
_mainVFM = new VerticalFieldManager(VerticalFieldManager.USE_ALL_WIDTH);
_mainVFM.setMargin(10, 10, 40, 10);
((VerticalFieldManager) getMainManager()).setBackground(BackgroundFactory.createSolidBackground(Constants.BgColorCode));
// HEADING
_headingHFM = new HorizontalFieldManager(HorizontalFieldManager.USE_ALL_WIDTH);
_headingLabelField = new LabelField(Constants.Text_heading);
_headingLabelField.setFont(ApplicationFont.labelFont);
_headingHFM.add(_headingLabelField);
_headingHFM.setMargin(0, 0, 20, 0);
// IMPORTANT CALCULATION
String productLineString = Constants.Text_ProductLine;
int charWidth = 0;
for (int i = 0; i < productLineString.length(); i++) {
charWidth = Font.getDefault().getAdvance(String.valueOf(productLineString.charAt(i)));
totalWidth += charWidth;
System.out.println(totalWidth + "===>>>>>>total width" + i);
}
System.out.println(totalWidth + "===>>>>>>total width");
totalWidth = totalWidth + 10;
// _productLine LINE
_productLineLabelField = new LabelField(Constants.Text_ProductLine);
_productLineLabelField.setFont(ApplicationFont.explainationFont);
_productLineLabelField.setMargin(8, 0, 0, 0);
int plSetTo1 = 0;
_productLineOCF = new ObjectChoiceField("", _productLineArray, plSetTo1, Field.FIELD_RIGHT);
_productLineOCF.setFont(ApplicationFont.explainationFont);
_productLineOCF.setChangeListener(this);
_productHFM = new HorizontalFieldManager(USE_ALL_WIDTH | FOCUSABLE);
_productHFM.add(_productLineLabelField);
_productHFM.add(_productLineOCF);
// HP
_hp1 = new VerticalFieldManager();
_HPLabelField = new LabelField(Constants.Text_HP);
_HPLabelField.setFont(ApplicationFont.explainationFont);
_HPLabelField.setMargin(25, 0, 0, 0);
_hp1.add(_HPLabelField);
_hp2 = new VerticalFieldManager();
int hpSetTo1 = 0;
String data_HP[] = { " Select HP" };
_HP_OCF = new ObjectChoiceField("", data_HP, hpSetTo1, Field.FIELD_RIGHT | USE_ALL_WIDTH);
_HP_OCF.setMinimalWidth(totalWidth + 50);
_HP_OCF.setFont(ApplicationFont.explainationFont);
_HP_OCF.setChangeListener(this);
_hp2.add(_HP_OCF);
_hpHFM = new HorizontalFieldManager(HorizontalFieldManager.USE_ALL_WIDTH) {
protected void sublayout(int maxWidth, int maxHeight) {
super.sublayout(maxWidth, maxHeight);
int x = totalWidth;
setPositionChild(_hp2, x, 0);
}
};
_hpHFM.add(_hp1);
_hpHFM.add(_hp2);
_RPM_HFM = new HorizontalFieldManager();
// RPM
_RPMLabelField = new LabelField(Constants.Text_RPM);
_RPMLabelField.setFont(ApplicationFont.explainationFont);
_RPMLabelField.setMargin(25, 0, 0, 0);
_RPM_HFM.add(_RPMLabelField);
int rpmSetTo1 = 0;
String data_RPM[] = { "Select RPM" };
_RPM_OCF = new ObjectChoiceField("", data_RPM, rpmSetTo1, Field.FIELD_RIGHT);
_RPM_OCF.setMinimalWidth(totalWidth + 50);
_RPM_OCF.setChangeListener(this);
_RPM_HFM.add(_RPM_OCF);
_voltageHFM = new HorizontalFieldManager();
// VOLTAGE
_voltageLabelField = new LabelField(Constants.Text_voltage);
_voltageLabelField.setFont(ApplicationFont.explainationFont);
_voltageLabelField.setMargin(25, 0, 0, 0);
_voltageHFM.add(_voltageLabelField);
int volSetTo1 = 0;
String data_voltage[] = { "Select Voltage" };
_voltageOCF = new ObjectChoiceField("", data_voltage, volSetTo1, Field.FIELD_RIGHT);
_voltageOCF.setMinimalWidth(totalWidth + 50);
_voltageOCF.setChangeListener(this);
_voltageHFM.add(_voltageOCF);
_frameHFM = new HorizontalFieldManager();
// FRAME SIZE
_frameSizeLabelField = new LabelField(Constants.Text_frameSize);
_frameSizeLabelField.setFont(ApplicationFont.explainationFont);
_frameSizeLabelField.setMargin(25, 0, 0, 0);
_frameHFM.add(_frameSizeLabelField);
int fSetTo1 = 0;
_frameSizeOCF = new ObjectChoiceField("", _frameArray, fSetTo1, Field.FIELD_RIGHT);
_frameSizeOCF.setMinimalWidth(totalWidth + 50);
_frameSizeOCF.setChangeListener(this);
_frameHFM.add(_frameSizeOCF);
// -OR- LABEL
_orLabelField = new LabelField(Constants.Text_or);
_orLabelField.setMargin(20, 0, 0, 0);
_orLabelField.setFont(ApplicationFont.labelFont);
// SEARCH BY PART NUMBER
_SearchByPartNumberField = new LabelField(Constants.Text_PartNoLabel);
_SearchByPartNumberField.setMargin(20, 0, 0, 0);
_SearchByPartNumberField.setFont(ApplicationFont.labelFont);
// ENTER PART NUMBER
_enterPartNoHFM = new HorizontalFieldManager();
_enterPartNoLabelField = new LabelField("Enter Part Number: ");
_partNumberEditField = new EditField();
_partNumberEditField.setBorder(roundedBorder);
_enterPartNoHFM.add(_enterPartNoLabelField);
_enterPartNoHFM.add(_partNumberEditField);
_enterPartNoHFM.setMargin(20, 0, 0, 0);
// SAERCH BUTTON
_searchButtonField = new ButtonField(" Search ", ButtonField.CONSUME_CLICK | ButtonField.FIELD_HCENTER);
_searchButtonField.setChangeListener(this);
_searchButtonField.setMargin(20, 0, 0, 0);
_checkForUpdates = new ButtonField(Constants.Button_checkForUpdates, ButtonField.CONSUME_CLICK | ButtonField.FIELD_HCENTER);
_checkForUpdates.setMargin(10, 0, 0, 0);
_checkForUpdates.setChangeListener(this);
add(_pageHeaderHFM);
_mainVFM.add(_headingHFM);
_mainVFM.add(_productHFM);
_mainVFM.add(_hpHFM);
_mainVFM.add(_RPM_HFM);
_mainVFM.add(_voltageHFM);
_mainVFM.add(_frameHFM);
_mainVFM.add(_orLabelField);
_mainVFM.add(_SearchByPartNumberField);
_mainVFM.add(_enterPartNoHFM);
_mainVFM.add(_searchButtonField);
_mainVFM.add(_checkForUpdates);
add(_mainVFM);
}
I am fine with the width of the OCF but height and the position of the OCF must be settled as required. This is the output I am getting with this code.
This answer is based on following links:
Align Field in HorizontalFieldManager.
BlackBerry HorizontalFieldManager alignment.
Try following code:
class HomeScreen extends MainScreen {
public HomeScreen() {
super(Field.USE_ALL_WIDTH | Field.USE_ALL_HEIGHT | MainScreen.VERTICAL_SCROLL);
VerticalFieldManager vfmMain = new VerticalFieldManager(Field.USE_ALL_WIDTH);
// LabelField
LabelField lblFOne = new LabelField("LabelField One", Field.FIELD_LEFT | Field.FIELD_VCENTER);
// ObjectChoiceField
VerticalFieldManager vfmChoiceFieldContainerOne = new VerticalFieldManager(Field.USE_ALL_WIDTH | Field.FIELD_RIGHT);
final String[] options = new String[] { "Choice One - A very long string.", "Choice B", "Choice C" };
ObjectChoiceField ocfOne = new ObjectChoiceField("", options, 0, Field.FIELD_RIGHT | ObjectChoiceField.FORCE_SINGLE_LINE);
vfmChoiceFieldContainerOne.add(ocfOne);
// Contain a row of LabelField and ObjectChoiceField
HorizontalFieldManager hfmRowOne = new HorizontalFieldManager(Field.USE_ALL_WIDTH | Field.FOCUSABLE);
hfmRowOne.setBackground(BackgroundFactory.createSolidBackground(Color.GREEN));
hfmRowOne.add(lblFOne);
hfmRowOne.add(vfmChoiceFieldContainerOne);
vfmMain.add(hfmRowOne);
add(vfmMain);
}
}
Related
vf=new VerticalFieldManager()
{
public void paint(Graphics graphics)
{
int theta = Fixed32.toFP(180);
int cell_11 = Fixed32.cosd(theta);
int cell_12 = -Fixed32.sind(theta);
int cell_21 = Fixed32.sind(theta);
int cell_22 = Fixed32.cosd(theta);
int[] rotate = new int[]
{ cell_11, cell_12,
0, 0,
cell_21, cell_22,
};
super.paint(graphics);
myFont = Font.getDefault().derive(Font.PLAIN, 0,
DrawStyle.HCENTER, Font.BOLD,
0, rotate);
vf.setFont(myFont );
}
};
I have written the following code here the background image is displaying but the image did not cover the full background
private Bitmap background;
int mWidth = Display.getWidth();
int mHeight = Display.getHeight();
public MyScreen()
{
// Set the displayed title of the screen
//backgroundBitmap = Bitmap.getBitmapResource("slidimage.png");
final Bitmap background = Bitmap.getBitmapResource("slidimage.png");
HorizontalFieldManager vfm = new HorizontalFieldManager(USE_ALL_HEIGHT | USE_ALL_WIDTH) {
public void paint(Graphics g) {
g.drawBitmap(0, 0,mWidth, mHeight, background, 0, 0);
super.paint(g);
}
};
add(vfm);
public static Bitmap resizeBitmap(Bitmap image, int width, int height)
{
int rgb[] = new int[image.getWidth()*image.getHeight()];
image.getARGB(rgb, 0, image.getWidth(), 0, 0, image.getWidth(), image.getHeight());
int rgb2[] = rescaleArray(rgb, image.getWidth(), image.getHeight(), width, height);
Bitmap temp2 = new Bitmap(width, height);
temp2.setARGB(rgb2, 0, width, 0, 0, width, height);
return temp2;
}
You can use the above method to resize the image
just pass the image to be resized and its width and height .
and the function will return the resized image .
where rescale Array is the below method
private static int[] rescaleArray(int[] ini, int x, int y, int x2, int y2)
{
int out[] = new int[x2*y2];
for (int yy = 0; yy < y2; yy++)
{
int dy = yy * y / y2;
for (int xx = 0; xx < x2; xx++)
{
int dx = xx * x / x2;
out[(x2 * yy) + xx] = ini[(x * dy) + dx];
}
}
return out;
}
For my current code, it will download the images first then only display data and cause the device like lagging.
public Custom_ListField(Vector content, boolean islatest) {
this.content = content;
this.islatest = islatest;
newsid = new int[content.size()];
title = new String[content.size()];
category = new String[content.size()];
date = new String[content.size()];
imagepath = new String[content.size()];
catsid = new int[content.size()];
imagebitmap = new Bitmap[content.size()];
ischeck = new boolean[content.size()];
for (int i = 0; i < content.size(); i++) {
newslist = (List_News) content.elementAt(i);
newsid[i] = newslist.getID();
title[i] = newslist.getNtitle();
category[i] = newslist.getNewCatName();
date[i] = newslist.getNArticalD();
imagepath[i] = newslist.getImagePath();
catsid[i] = newslist.getCatID();
ischeck[i] = false;
if (!imagepath[i].toString().equals("no picture")) {
if (Config_GlobalFunction.isConnected())
imagebitmap[i] = Util_ImageLoader.loadImage(imagepath[i]);
else
imagebitmap[i] = localimage;
}
}
initCallbackListening();
}
private void initCallbackListening() {
callback = new ListCallback();
this.setCallback(callback);
this.setRowHeight(-2);
}
private class ListCallback implements ListFieldCallback {
public ListCallback() {
}
public void drawListRow(ListField listField, Graphics graphics,
final int index, int y, int width) {
currentPosition = index;
if (!imagepath[index].toString().equals("no picture")) {
float ratio = (float) ((float) localimage.getHeight() / (float) imagebitmap[index]
.getHeight());
Bitmap temp = new Bitmap(
(int) (imagebitmap[index].getWidth() * ratio),
(int) (imagebitmap[index].getHeight() * ratio));
imagebitmap[index].scaleInto(temp, Bitmap.FILTER_BILINEAR,
Bitmap.SCALE_TO_FIT);
imagebitmap[index] = temp;
graphics.drawBitmap(
Display.getWidth()
- localimage.getWidth()
- 5
+ ((localimage.getWidth() - imagebitmap[index]
.getWidth()) / 2),
y
+ (listField.getRowHeight(index) - imagebitmap[index]
.getHeight()) / 2,
imagebitmap[index].getWidth(),
imagebitmap[index].getHeight(), imagebitmap[index], 0,
0);
graphics.setColor(Color.BLACK);
text = Config_GlobalFunction
.wrap(title[index], Display.getWidth()
- imagebitmap[index].getWidth() - 15);
for (int i = 0; i < text.size(); i++) {
int liney = y + (i * Font.getDefault().getHeight());
graphics.drawText(
(String) text.elementAt(i),
5,
liney + 3,
DrawStyle.TOP | DrawStyle.LEFT | DrawStyle.ELLIPSIS,
Display.getWidth() - imagebitmap[index].getWidth()
- 10);
}
} else {
graphics.setColor(Color.BLACK);
text = Config_GlobalFunction.wrap(title[index],
Display.getWidth() - 10);
for (int i = 0; i < text.size(); i++) {
int liney = y + (i * Font.getDefault().getHeight());
graphics.drawText(
(String) text.elementAt(i),
5,
liney + 3,
DrawStyle.TOP | DrawStyle.LEFT | DrawStyle.ELLIPSIS,
Display.getWidth() - 10);
}
}
if (text.size() == 2) {
graphics.setColor(Color.GRAY);
graphics.drawText(date[index], 5, y
+ Font.getDefault().getHeight() + 3);
if (islatest) {
graphics.setColor(Color.RED);
graphics.drawText(category[index], Font.getDefault()
.getAdvance(date[index]) + 15, y
+ Font.getDefault().getHeight() + 3);
}
} else if (text.size() == 3) {
graphics.setColor(Color.GRAY);
graphics.drawText(date[index], 5, y
+ Font.getDefault().getHeight() * 2 + 3);
if (islatest) {
graphics.setColor(Color.RED);
graphics.drawText(category[index], Font.getDefault()
.getAdvance(date[index]) + 15, y
+ Font.getDefault().getHeight() * 2 + 3);
}
}
if (!imagepath[index].toString().equals("no picture"))
setRowHeight(index, imagebitmap[index].getHeight() + 10);
else {
if (text.size() == 2)
setRowHeight(index, getRowHeight() + 9);
else if (text.size() == 3) {
setRowHeight(index, getRowHeight() * 15 / 10 + 9);
}
}
graphics.setColor(Color.WHITE);
graphics.drawRect(0, y, width, listField.getRowHeight(index));
ischeck[index] = true;
}
}
I want this imagebitmap[i] = Util_ImageLoader.loadImage(imagepath[i]); run after display data so that no need stuck there. However, I tried to put inside drawListRow, it works but very slow because initially display it will run 0-8 times then when i scroll the listfield, it run again. It was download and download again.
Update
public class Util_LazyLoader implements Runnable {
String url = null;
BitmapDowloadListener listener = null;
public Util_LazyLoader(String url, BitmapDowloadListener listener) {
this.url = url;
this.listener = listener;
}
public void run() {
Bitmap bmpImage = getImageFromWeb(url);
listener.ImageDownloadCompleted(bmpImage);
}
private Bitmap getImageFromWeb(String url) {
HttpConnection connection = null;
InputStream inputStream = null;
EncodedImage bitmap;
byte[] dataArray = null;
try {
connection = (HttpConnection) (new ConnectionFactory())
.getConnection(url + Database_Webservice.ht_params)
.getConnection();
int responseCode = connection.getResponseCode();
if (responseCode == HttpConnection.HTTP_OK) {
inputStream = connection.openDataInputStream();
dataArray = IOUtilities.streamToBytes(inputStream);
}
} catch (Exception ex) {
} finally {
try {
inputStream.close();
connection.close();
} catch (Exception e) {
}
}
if (dataArray != null) {
bitmap = EncodedImage.createEncodedImage(dataArray, 0,
dataArray.length);
return bitmap.getBitmap();
} else {
return null;
}
}
}
I created a new class but i don't know how to use it.
You need to use lazy loading concept here.
For ex:
http://supportforums.blackberry.com/t5/Java-Development/How-to-load-images-quickly-like-android/m-p/1487995#M187253
http://supportforums.blackberry.com/t5/Java-Development/Lazy-loading-issue-in-blackberry/m-p/1835127
You need to download images in a separate thread (not in UI Thread). Actually what happens when you render a list row , it looks for bitmap image.
So what you can do once you are creating your List view. Provide a default loading bitmap image, start a thread to download image ,
you should create method on thread where you are putting the data from Url to vector. this could be in your connection class where you have extend as thread.
like this>>>>
getimagemethod(image[i]);
after you declare your method get the image string url to the method. like this>>
private void getimagemethod(String image2)
{
this.imageforlist = image2;
// you should declare imageforlist string as global string..
newBitmap1 = Util_ImageLoader.getImageFromUrl(imageforlist);
//newBitmap1 is also global Bitmap..**
}
after this put your bitmap which is newBitmap1 to the Vector like this>>
imagevct.addElement(newBitmap1);
here imagevct is vector which is also global**
**inorder to create global vector use this....
private Vector imagevct = new Vector();
now you are ready to draw the bitmap on your list
for that do it like this...
public void drawListRow(ListField list, Graphics g, int index, int y, int w) {
Bitmap imagee = (Bitmap) imagevct.elementAt(index);
g.drawBitmap(HPADDING, 15 + y, 60, 60, imagee , 0, 0);
}
Here HPADDING is>>>>
private static final int HPADDING = Display.getWidth() <= 320 ? 6 : 8;
this is just tutorial sample step by step..
if any query then you can post here...
I want to add a bar at the bottom of the screen which has images and a string ,i wanted to have the spacing equally like
img1 string img2|img3 ,this is how the bottom bar should look like,below code is not wroking properly i am gettign the alignment and the last iamge is getting disappeared.
HorizontalFieldManager horizontalFieldManager = new HorizontalFieldManager(
FIELD_BOTTOM) {
public void paint(Graphics graphics) {
graphics.setBackgroundColor(0x316AC5);
graphics.clear();
super.paint(graphics);
}
};
Bitmap fadeBitmap = Bitmap
.getBitmapResource("GE_TimeZone_Fade_blue.PNG");
Bitmap clockBitmap = Bitmap.getBitmapResource("GE_Cal_icon_blue.PNG");
Bitmap tzBitmap = Bitmap
.getBitmapResource("GE_TimeZone_Button_blue.PNG");
final ImageButtonField unfocus = new ImageButtonField("",
Field.FOCUSABLE | FIELD_LEFT, "GE_TimeZone_Fade_blue.PNG",
"GE_TimeZone_Fade_blue.PNG", 0xFFFFFF);
LabelField test = new LabelField("hello");
final ImageButtonField bitmapField = new ImageButtonField("",
Field.FOCUSABLE | FIELD_HCENTER, "GE_Cal_icon_blue.PNG",
"GE_Cal_icon_onSelect.PNG", 0xFFFFFF);
final ImageButtonField bitmapField1 = new ImageButtonField("",
Field.FOCUSABLE | FIELD_RIGHT, "GE_TimeZone_Button_blue.PNG",
"GE_TimeZone_Btn_OnSelect.PNG", 0xFFFFFF);
int margin = ((Display.getWidth() - (fadeBitmap.getWidth()
+ clockBitmap.getWidth() + tzBitmap.getWidth() + test
.getWidth())) / 4);
unfocus.setMargin(0, margin, 0, 0);
test.setMargin(0, margin, 0, 0);
bitmapField.setMargin(0, margin, 0, 0);
bitmapField1.setMargin(0, margin, 0, 0);
horizontalFieldManager.add(unfocus);
horizontalFieldManager.add(test);
horizontalFieldManager.add(bitmapField);
horizontalFieldManager.add(bitmapField1);
this.setStatus(horizontalFieldManager);
There is a problem on the code you are using. Check following line.
int margin = ((Display.getWidth() - (fadeBitmap.getWidth()
+ clockBitmap.getWidth() + tzBitmap.getWidth() + test
.getWidth())) / 4);
The getWidth() and getHeight() of any Field will return valid values if the layout method of it's parent manager gets called.
So, adjusting the margin using getWidth(), getHeight() is not safe.
But it is possible to control the alignment and position of the Fields via extending HorizontalFieldManager. Check the following codes and output to get an idea about how it can be done.
Output
Using the StatusFieldManager:
StatusFieldManager statusFieldManager = new StatusFieldManager();
statusFieldManager.setBackground(BackgroundFactory.createSolidBackground(0x316AC5));
final Bitmap bmTest = Bitmap.getBitmapResource("bitmap.png");
BitmapField bmOne = new BitmapField(bmTest, Field.FOCUSABLE | FIELD_LEFT);
BitmapField bmTwo = new BitmapField(bmTest, Field.FOCUSABLE | FIELD_LEFT);
BitmapField bmThree = new BitmapField(bmTest, Field.FOCUSABLE | FIELD_LEFT);
LabelField lblTest = new LabelField("Test");
statusFieldManager.add(bmOne);
statusFieldManager.add(lblTest);
statusFieldManager.add(bmTwo);
statusFieldManager.add(bmThree);
setStatus(statusFieldManager);
Implementation of StatusFieldManager
class StatusFieldManager extends HorizontalFieldManager {
protected void sublayout(int width, int height) {
int numField = getFieldCount();
Field f;
int nHeight = 0, maxFieldWidth = width / 4;
if (numField == 4) {
f = getField(0);
layoutChild(f, maxFieldWidth, height);
nHeight = Math.max(nHeight, f.getHeight());
f = getField(1);
layoutChild(f, maxFieldWidth, height);
nHeight = Math.max(nHeight, f.getHeight());
f = getField(2);
layoutChild(f, maxFieldWidth, height);
nHeight = Math.max(nHeight, f.getHeight());
f = getField(3);
layoutChild(f, maxFieldWidth, height);
nHeight = Math.max(nHeight, f.getHeight());
// set position of the child fields
int x = 0, y = 0;
int requiredFieldWidth = 0;
for (int i=0;i<numField;i++) {
requiredFieldWidth += getField(i).getWidth();
}
int spaceBetweenFields = (width - requiredFieldWidth) / (numField - 1);
for (int i=0;i<numField;i++) {
setPositionChild(getField(i), x, (nHeight - getField(i).getHeight()) / 2);
x += getField(i).getWidth() + spaceBetweenFields;
}
setExtent(width, nHeight);
} else {
setExtent(0, 0);
}
}
}
try this -
unfocus.setMargin(0, margin, 0, 0);
test.setMargin(0, 10, 0, 0);
bitmapField.setMargin(0, 10, 0, 0);
bitmapField1.setMargin(0, 10, 0, 0);
I have the following program does not work
NOTE: compiled on windows 7.
Gdk.Screen screen = Gdk.Screen.get_default ();
Gdk.Window rootWin2 = screen.get_active_window ();
int width, height;
rootWin2.get_size (out width, out height);
Gdk.Colormap? colormap= rootWin2.get_colormap ();
Gdk.Pixbuf? dest = new Gdk.Pixbuf (Gdk.Colorspace.RGB, false, 8, width, height);
Gdk.pixbuf_get_from_drawable (dest, rootWin2, colormap, 0, 0, 0, 0, width, height);
try {
dest.save("screenShoot2.jpg", "jpeg");
} catch (Error e) {
stdout.printf("\n eerorrr " + e.message + "\n");
}
using Gtk;
int main (string[] args) {
Gtk.init (ref args);
int width, height;
Gdk.Window win = Gdk.get_default_root_window();
width = win.get_width();
height = win.get_height();
Gdk.Pixbuf screenshot = Gdk.pixbuf_get_from_window(win, 0, 0, width, height);
screenshot.save("screenshot.png","png");
return 0;
}
// valac --pkg gtk+-3.0 --pkg gdk-3.0 screenshot.vala