BlackBerry - 开发类似 Cropit 的应用程序

Posted

技术标签:

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

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

非常感谢

【问题讨论】:

【参考方案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;
    

【讨论】:

以上是关于BlackBerry - 开发类似 Cropit 的应用程序的主要内容,如果未能解决你的问题,请参考以下文章

jquery裁剪图片插件cropit示例

[当套接字可用时使用HTTP长轮询(例如iPhone,Blackberry)

使用cropit的多个预览图像不同的高度和宽度

如何使用带有 php 的cropit jquery 插件裁剪和上传照片

黑莓blackberry。~

iPhone、Android 和 Blackberry 的移动开发