首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >BlackBerry -开发类似Cropit的应用

BlackBerry -开发类似Cropit的应用
EN

Stack Overflow用户
提问于 2010-06-05 01:28:59
回答 1查看 294关注 0票数 1

我想开发类似于裁剪的应用程序,我只想知道如何增加或减少图像上矩形的大小(多点触摸事件),这定义了图像部分被裁剪。

非常感谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-06-09 23:12:00

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

要使模拟器多点触摸: Alt+T,然后使用鼠标左键为手指1,鼠标右键为手指2。

代码示例:

代码语言:javascript
复制
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;
    }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2976403

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档