BlackBerry Image Field水平填充屏幕

时间:2012-08-05 19:17:49

标签: image blackberry bitmap

我是BlackBerry Development(5.0)的新手。我在Android应用程序开发方面有一点经验。 我要做的是在整个屏幕上填充图像(水平) 类似于在布局文件中使用fill_parent在Android中可以执行的操作。 我已经在一些论坛上找到了解决方案,但没有得到令人满意的解决方案。

这就是我获取图像的方式

Bitmap headerLogo = Bitmap.getBitmapResource("uperlogo.png");
BitmapField headerLogoField = 
    new BitmapField(headerLogo, BitmapField.USE_ALL_WIDTH | Field.FIELD_HCENTER);
setTitle(headerLogoField);

此代码在顶部(根据需要)和中心提供了我的标题。我只想让它水平拉伸以覆盖所有空间。

1 个答案:

答案 0 :(得分:3)

可以在创建Bitmap之前水平拉伸BitmapField,这样就可以解决问题。但是,拉伸Bitmap并将其用作标题会为支持屏幕旋转的设备(例如Storm,Torch系列)带来问题。在这种情况下,您必须维护两个拉伸的Bitmap实例,一个用于纵向模式,另一个用于横向模式。此外,您还需要编写一些额外的代码,以根据方向设置适当的Bitmap。如果您不想这样做,请检查以下两种方法:


使用CustomBitmapField实例

可以使用可以水平拉伸Bitmap的CustomBitmapField。检查实施情况。

class MyScreen extends MainScreen {

    public MyScreen() {
        Bitmap bm = Bitmap.getBitmapResource("uperlogo.png");
        setTitle(new CustomBitmapField(bm));
    }

    class CustomBitmapField extends Field {
        private Bitmap bmOriginal;
        private Bitmap bm;

        private int bmHeight;

        public CustomBitmapField(Bitmap bm) {
            this.bmOriginal = bm;
            this.bmHeight = bm.getHeight();
        }

        protected void layout(int width, int height) {
            bm = new Bitmap(width, bmHeight);
            bmOriginal.scaleInto(bm, Bitmap.FILTER_BILINEAR);
            setExtent(width, bmHeight);
        }

        protected void paint(Graphics graphics) {
            graphics.drawBitmap(0, 0, bm.getWidth(), bmHeight, bm, 0, 0);
        }
    }
}


使用后台实例

Background对象可以轻松解决问题。如果Background实例可以设置为HorizontalFieldManager,它将使用其可用的所有宽度,那么在屏幕旋转的情况下,它将处理其大小和背景绘制。 Background实例本身将处理所提供的Bitmap的拉伸。请检查以下代码。

class MyScreen extends MainScreen {

    public MyScreen() {
        setTitle(getMyTitle());         
    }

    private Field getMyTitle() {
        // Logo.
        Bitmap bm = Bitmap.getBitmapResource("uperlogo.png");

        // Create a manager that contains only a dummy field that doesn't 
        // paint anything and has same height as the logo. Background of the 
        // manager will serve as the title.

        HorizontalFieldManager hfm = new HorizontalFieldManager(USE_ALL_WIDTH);
        Background bg = BackgroundFactory.createBitmapBackground(bm, Background.POSITION_X_LEFT, Background.POSITION_Y_TOP, Background.REPEAT_SCALE_TO_FIT);
        hfm.setBackground(bg);
        hfm.add(new DummyField(bm.getHeight()));

        return hfm;
    }

    // Implementation of a dummy field
    class DummyField extends Field {
        private int logoHeight;

        public DummyField(int height) {
            logoHeight = height;
        }

        protected void layout(int width, int height) {
            setExtent(1, logoHeight);
        }

        protected void paint(Graphics graphics) {
        }
    }
}