【问题标题】:BlackBerry - Develope Cropit Like ApplicationBlackBerry - 开发类似 Cropit 的应用程序
【发布时间】:2010-06-04 17:28:58
【问题描述】:

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

非常感谢

【问题讨论】:

    标签: image graphics blackberry blackberry-storm crop


    【解决方案1】:

    使用 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;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多