Клиент и сервер должен договориться, как связаться; часть этого - может ли коммуникация быть сжата. HTTP был разработан как модель запроса/ответа, и исходное создание почти наверняка предполагалось, чтобы всегда иметь маленькие запросы и потенциально большие ответы. Сжатие не , потребовал реализовывать HTTP, существует и серверы и клиенты, которые не поддерживают его.
сжатие HTTP реализовано клиентом, говорящим это, может поддерживать сжатие, и если сервер видит это в запросе, и это поддерживает сжатие, это может сжать ответ. Для сжатия запроса, у клиента должен был бы быть "предварительный запрос", который на самом деле согласовал это, запрос будет выполнен сжатый, ИЛИ это должно было бы потребовать сжатия как поддерживаемого кодирования для ВСЕХ запросов.
* ОБНОВЛЯЮТ февраль, '17 * Это были 8 лет, но как @Phil_1984_ примечания, 3-е возможное решение было бы для клиента и сервера, чтобы согласовать поддержку сжатия и затем использовать это для последующих запросов. На самом деле вещи как HSTS работают просто этот путь с клиентом, кэширующимся, что сервер ожидает только говорить TLS и игнорировать любые незашифрованные ссылки. HTTP был явно разработан, чтобы быть не сохраняющим состояние, но мы переместились кроме того в эту точку.
Если вы используете net.rim.device.api.system.PNGEncodedImage или один из других классов, расширенных из net.rim.device.api.system.EncodedImage, вы можете использовать scaleImage32 (int scaleX, int scaleY) (доступен в OS 4.2 и новее) для масштабирования изображения до нужного размера. Однако имейте в виду, что scaleX и scaleY, хотя и набраны как int, на самом деле являются net.rim.device.api.math.Fixed32, поэтому для отображения изображения половинного размера:
EncodedImage halfSize = myImage.scaleImage32(Fixed32.toFP(2), Fixed32.toFP(2));
Или для изображения, вдвое оригинального размера:
EncodedImage twiceSize = myImage.scaleImage32(Fixed32.tenThouToFP(5000), Fixed32.tenThouToFP(5000));
public EncodedImage sizeImage(EncodedImage image, int width,
int height) {
EncodedImage result = null;
int currentWidthFixed32 = Fixed32.toFP(image.getWidth());
int currentHeightFixed32 = Fixed32.toFP(image.getHeight());
int requiredWidthFixed32 = Fixed32.toFP(width);
int requiredHeightFixed32 = Fixed32.toFP(height);
int scaleXFixed32 = Fixed32.div(currentWidthFixed32,
requiredWidthFixed32);
int scaleYFixed32 = Fixed32.div(currentHeightFixed32,
requiredHeightFixed32);
result = image.scaleImage32(scaleXFixed32, scaleYFixed32);
return result;
}
Эта функция будет использоваться в приведенном ниже коде.
Простое рисование изображений http://img268.imageshack.us/img268/9918 /bb8310.png
Позволяет раскрасить 9 изображений в виде таблицы, изображения разные по размеру, но мы изменим их размер до 80x80 и дадим им поля 10 пикселей.
Предполагая, что у вас есть 9 изображений PNG в ресурсах вашего проекта.
Код:
class Scr extends MainScreen {
int mImgWidth = 80;
int mImgHeight = 80;
int mImgMargin = 10;
String fileNames[] = { "1.png", "2.png", "3.png", "4.png", "5.png",
"6.png", "7.png", "8.png", "9.png" };
EncodedImage[] mImages;
public Scr() {
super();
prepareImages();
}
private void prepareImages() {
mImages = new EncodedImage[fileNames.length];
for (int i = 0; i < fileNames.length; i++) {
EncodedImage image = EncodedImage
.getEncodedImageResource(fileNames[i]);
mImages[i] = sizeImage(image, mImgWidth, mImgHeight);
}
}
protected void paint(Graphics graphics) {
paintImages(graphics);
super.paint(graphics);
}
private void paintImages(Graphics graphics) {
int scrWidth = Display.getWidth();
int columns = scrWidth / (mImgWidth + 2 * mImgMargin);
int rows = mImages.length / columns
+ (mImages.length % columns > 0 ? 1 : 0);
for (int i = 0; i < rows; i++) {
for (int j = 0; j < columns; j++) {
int posX = j * (mImgWidth + 2 * mImgMargin) + mImgMargin;
int posY = i * (mImgHeight + 2 * mImgMargin) + mImgMargin;
EncodedImage image = mImages[i * columns + j];
graphics.drawImage(posX, posY, mImgWidth, mImgHeight,
image, 0, 0, 0);
}
}
}
}
Взгляните на метод paint () в Scr. При каждом обновлении перерисовывается вся таблица изображений, что означает 9 вызовов drawImage для каждой краски. Что, если мы просто возьмем форму этой таблицы и используем ее в методе paint ()?
class ScrOpt extends MainScreen {
int mScrWidth = Display.getWidth();
int mScrHeight = Display.getHeight();
int mImgWidth = 80;
int mImgHeight = 80;
int mImgMargin = 10;
String fileNames[] = { "1.png", "2.png", "3.png", "4.png", "5.png",
"6.png", "7.png", "8.png", "9.png" };
EncodedImage[] mImages;
Bitmap mImgTable;
public ScrOpt() {
super();
prepareImages();
mImgTable = paintImages();
}
private void prepareImages() {
mImages = new EncodedImage[fileNames.length];
for (int i = 0; i < fileNames.length; i++) {
EncodedImage image = EncodedImage
.getEncodedImageResource(fileNames[i]);
mImages[i] = sizeImage(image, mImgWidth, mImgHeight);
}
}
private Bitmap paintImages() {
Bitmap result = new Bitmap(mScrWidth, mScrHeight);
Graphics graphics = new Graphics(result);
int scrWidth = mScrWidth;
int columns = scrWidth / (mImgWidth + 2 * mImgMargin);
int rows = mImages.length / columns
+ (mImages.length % columns > 0 ? 1 : 0);
for (int i = 0; i < rows; i++) {
for (int j = 0; j < columns; j++) {
int posX = j * (mImgWidth + 2 * mImgMargin) + mImgMargin;
int posY = i * (mImgHeight + 2 * mImgMargin) + mImgMargin;
EncodedImage image = mImages[i * columns + j];
graphics.drawImage(posX, posY, mImgWidth, mImgHeight, image, 0,
0, 0);
}
}
return result;
}
protected void paint(Graphics graphics) {
super.paint(graphics);
graphics.drawBitmap(0, 0, mScrWidth, mScrHeight, mImgTable, 0, 0);
}
}
Вы можете еще больше оптимизировать ее, с использованием метода paintBackground ()
Все вышесказанное касается рисования изображений непосредственно на экране с использованием Graphics . Иногда это здорово - когда вы хотите отобразить некоторую анимацию или фоновое изображение. Но что, если вы хотите сохранить стандартный пользовательский интерфейс и использовать изображения в качестве полей?
альтернативный текст http://img142.imageshack.us/img142/7485/bb83102.png
Прямым путем является BitmapField
class ScrBmpField extends MainScreen {
int mImgWidth = 80;
int mImgHeight = 80;
int mImgMargin = 10;
String fileNames[] = { "1.png", "2.png", "3.png", "4.png", "5.png",
"6.png", "7.png", "8.png", "9.png" };
BitmapField[] mBmpFields;
public ScrBmpField() {
super(VERTICAL_SCROLL|VERTICAL_SCROLLBAR);
prepareBmpFields();
}
private void prepareBmpFields() {
mBmpFields = new BitmapField[fileNames.length];
for (int i = 0; i < fileNames.length; i++) {
EncodedImage image = EncodedImage
.getEncodedImageResource(fileNames[i]);
image = sizeImage(image, mImgWidth, mImgHeight);
mBmpFields[i] =
new BitmapField(image.getBitmap(), FOCUSABLE|FIELD_HCENTER);
mBmpFields[i].setMargin(mImgMargin, mImgMargin,
mImgMargin, mImgMargin);
add(mBmpFields[i]);
}
}
}
альтернативный текст http: / /img9.imageshack.us/img9/403/bb83103.png
Чтобы установить пользовательские позиции BitmapFields в диспетчере, вы можете реализовать диспетчер с пользовательским макетом :
class ScrLayout extends MainScreen {
int mScrWidth = Display.getWidth();
int mScrHeight = Display.getHeight();
int mImgWidth = 80;
int mImgHeight = 80;
int mImgMargin = 10;
String fileNames[] = { "1.png", "2.png", "3.png", "4.png", "5.png",
"6.png", "7.png", "8.png", "9.png" };
BitmapField[] mBmpFields;
public ScrLayout() {
super(VERTICAL_SCROLL | VERTICAL_SCROLLBAR);
prepareBmpFields();
}
private void prepareBmpFields() {
LayoutManager manager = new LayoutManager();
add(manager);
mBmpFields = new BitmapField[fileNames.length];
for (int i = 0; i < fileNames.length; i++) {
EncodedImage image = EncodedImage
.getEncodedImageResource(fileNames[i]);
image = sizeImage(image, mImgWidth, mImgHeight);
mBmpFields[i] =
new BitmapField(image.getBitmap(), FOCUSABLE);
manager.add(mBmpFields[i]);
}
}
class LayoutManager extends VerticalFieldManager {
public LayoutManager() {
super(VERTICAL_SCROLL | VERTICAL_SCROLLBAR);
}
protected void sublayout(int width, int height) {
int columns = mScrWidth / (mImgWidth + 2 * mImgMargin);
for (int i = 0, j = 0; i < mBmpFields.length; i++) {
int posX = j * (mImgWidth + 2 * mImgMargin) + mImgMargin;
int posY = i * (mImgHeight + 2 * mImgMargin) + mImgMargin;
Field field = mBmpFields[i];
layoutChild(field, mImgWidth, mImgHeight);
setPositionChild(field, posX, posY);
j = (j == columns - 1) ? 0 : j + 1;
}
setExtent(mScrWidth, mScrHeight);
}
public int getPreferredWidth() {
return mScrWidth;
}
public int getPreferredHeight() {
return mScrHeight;
}
}
}
Где-то в функции инициализации:
Image myImage = Image.createImage("/myimage.png");
И в функции рисования вашего холста:
g.drawImage(myImage, posX, posY, Graphics.TOP|Graphics.LEFT);
(где g - объект Graphics, который вы получаете от функции рисования)
edit: исправлена небольшая ошибка, как указано в комментариях