黑莓 - 像应用程序一样开发Cropit

时间:2010-06-04 17:28:59

标签: image graphics blackberry blackberry-storm crop

我想开发像应用程序一样的cropit,我只是想知道如何增加或减少图像上的矩形大小(多点触控事件),它定义了要裁剪的图像部分。

非常感谢

1 个答案:

答案 0 :(得分:2)

使用onTouchEvent,查找DOWN和MOVE事件以正确绘制选区。

进行模拟器多点触控:Alt + T然后用手指1的鼠标左键和手指2的鼠标右键。

代码示例:

class Scr extends MainScreen {

    XYPoint mLeftUp = null;
    XYPoint mRightBottom = null;
    XYPoint mCoursor = null;
    // Bitmap bitmap = Bitmap.getBitmapResource("wallpaper_bold.jpg");
    Bitmap bitmap = Bitmap.getBitmapResource("wallpaper_storm.jpg");
    BitmapField mBitmapField = new BitmapField(bitmap);

    public Scr() {
        add(mBitmapField);
        mCoursor = new XYPoint(bitmap.getWidth() >> 1,
                bitmap.getHeight() >> 1);
    }

    protected void makeMenu(Menu menu, int instance) {
        super.makeMenu(menu, instance);
        if (mLeftUp != null && mRightBottom != null) {
            menu.add(new MenuItem("crop", 0, 0) {
                public void run() {
                    XYRect rect = null;
                    if (mLeftUp.x > mRightBottom.x
                            && mLeftUp.y > mRightBottom.y) {
                        rect = new XYRect(mRightBottom, mLeftUp);
                    } else {
                        rect = new XYRect(mLeftUp, mRightBottom);
                    }
                    Bitmap crop = cropImage(bitmap, rect.x, rect.y,
                            rect.width, rect.height);
                    mBitmapField.setBitmap(crop);
                    mCoursor = new XYPoint(crop.getWidth() >> 1, crop
                            .getHeight() >> 1);
                    mLeftUp = null;
                    mRightBottom = null;
                    invalidate();
                }
            });

            menu.add(new MenuItem("reset", 0, 0) {
                public void run() {
                    mBitmapField.setBitmap(bitmap);
                    mCoursor = new XYPoint(bitmap.getWidth() >> 1, bitmap
                            .getHeight() >> 1);
                    invalidate();
                }
            });
        }
    }

    protected void paint(Graphics graphics) {
        super.paint(graphics);
        if (mCoursor != null) {
            graphics.setColor(Color.RED);
            graphics.drawLine(mCoursor.x - 4, mCoursor.y - 4,
                    mCoursor.x + 4, mCoursor.y + 4);
            graphics.drawLine(mCoursor.x + 4, mCoursor.y - 4,
                    mCoursor.x - 4, mCoursor.y + 4);
        }
        if (mLeftUp != null && mRightBottom != null) {
            graphics.setColor(Color.RED);
            graphics.drawPoint(mLeftUp.x, mLeftUp.y);
            graphics.drawPoint(mRightBottom.x, mRightBottom.y);
            graphics.drawPoint(mLeftUp.x, mRightBottom.y);
            graphics.drawPoint(mRightBottom.x, mLeftUp.y);
            graphics.setColor(Color.WHITESMOKE);
            XYRect redRect = null;
            if (mLeftUp.x > mRightBottom.x && mLeftUp.y > mRightBottom.y) {
                redRect = new XYRect(mRightBottom, mLeftUp);
            } else {
                redRect = new XYRect(mLeftUp, mRightBottom);
            }
            graphics.drawRect(redRect.x, redRect.y, redRect.width,
                    redRect.height);
        }
    }

    // comment block for Bold
    protected boolean touchEvent(TouchEvent message) {
        int x1 = message.getX(1);
        int y1 = message.getY(1);
        int x2 = message.getX(2);
        int y2 = message.getY(2);
        switch (message.getEvent()) {
        case TouchEvent.DOWN:
            if (x1 != -1) {
                mLeftUp = new XYPoint(x1, y1);
            } else if (x2 != -1) {
                mRightBottom = new XYPoint(x2, y2);
            }
            break;
        case TouchEvent.MOVE:
            if (x1 != -1) {
                mLeftUp = new XYPoint(x1, y1);
            }
            if (x2 != -1) {
                mRightBottom = new XYPoint(x2, y2);
            }
            break;
        case TouchEvent.UNCLICK:
            mLeftUp = null;
            mRightBottom = null;
        default:
            break;
        }
        invalidate();
        return true;
    }

    protected boolean navigationMovement(int dx, int dy, int status,
            int time) {
        moveCoursor(dx, dy);
        return true;
    }

    private void moveCoursor(int dx, int dy) {
        mCoursor.translate(dx, dy);
        if (mLeftUp != null) {
            mRightBottom = new XYPoint(mCoursor);
        }
        invalidate();
    }

    protected boolean navigationUnclick(int status, int time) {
        clickCoursor();
        return true;
    }

    private void clickCoursor() {
        if (mLeftUp != null && mLeftUp.equals(mCoursor)) {
            mLeftUp = null;
            mRightBottom = null;
        } else {
            mLeftUp = new XYPoint(mCoursor);
        }
        invalidate();
    }

    public static Bitmap cropImage(Bitmap image, int x, int y, int width,
            int height) {
        Bitmap result = new Bitmap(width, height);
        Graphics g = Graphics.create(result);
        g.drawBitmap(0, 0, width, height, image, x, y);
        return result;
    }
}