【问题标题】:Drawing on ImageView is too slow在 ImageView 上绘图太慢
【发布时间】:2016-06-13 01:31:17
【问题描述】:

我想要实现的是简单的ImageEditor,我已经开始创建简单的工具,即CropTool,如下所示:

public class CropTool implements ITool {
    RectF top, right, bottom, left, crop;
    Paint fillPaint, cropPaint;

    public CropTool() {
        crop = new RectF();
        top = new RectF();
        right = new RectF();
        left = new RectF();
        bottom = new RectF();

        fillPaint = new Paint();
        fillPaint.setStyle(Paint.Style.FILL);
        fillPaint.setARGB(150, 0, 0, 0);

        cropPaint = new Paint();
        cropPaint.setStyle(Paint.Style.STROKE);
        cropPaint.setARGB(255, 255, 99, 71);
    }

    @Override
    public void TouchStart(ImageView context, float x, float y) {
        crop.set(x, y, crop.right, crop.bottom);
    }

    @Override
    public void TouchMove(ImageView context, float x, float y) {
        crop.set(crop.left, crop.top, x, y);
    }

    @Override
    public void TouchUp(ImageView context, float x, float y) {
        crop.set(crop.left, crop.top, x, y);
    }

    @Override
    public void OnDraw(ImageView context, Canvas canvas) {
        if (crop.isEmpty())
            canvas.drawRect(0, 0, context.getWidth(), context.getHeight(), fillPaint);
        else {
            top.set(0, 0, context.getWidth(), crop.top);
            bottom.set(0, crop.bottom, context.getWidth(), context.getBottom());
            left.set(0, crop.top, crop.left, crop.bottom);
            right.set(crop.right, crop.top, context.getRight(), crop.bottom);

            canvas.drawRect(top, fillPaint);
            canvas.drawRect(bottom, fillPaint);
            canvas.drawRect(left, fillPaint);
            canvas.drawRect(right, fillPaint);

            canvas.drawRect(crop, cropPaint);
        }
    }
}

还有自定义的ImageView

public class ImageEditView extends ImageView {
    private ITool currentTool;

    public ImageEditView(Context context, AttributeSet attrs) {
        super(context, attrs);
        currentTool = new CropTool();
    }


    @Override
    public boolean onTouchEvent(MotionEvent event) {
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                if (currentTool != null) currentTool.TouchStart(this, event.getX(), event.getY());
                break;
            case MotionEvent.ACTION_MOVE:
                if (currentTool != null) currentTool.TouchMove(this, event.getX(), event.getY());
                break;
            case MotionEvent.ACTION_UP:
                if (currentTool != null) currentTool.TouchUp(this, event.getX(), event.getY());
                break;
        }
        invalidate();
        return true;
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        if (currentTool != null) currentTool.OnDraw(this, canvas);
    }
}

问题是,绘图太慢了,显示裁剪矩形需要大约 20 秒,我该如何优化它,或者这里做错了什么,我的方法是正确的还是有更好的方法?

【问题讨论】:

  • 在真实设备上运行良好

标签: android android-imageview android-canvas android-image


【解决方案1】:

模拟器与您的 PC 竞争资源(即使在 Xeon 上)的速度非常缓慢!在硬件设备上试用 - 手机或平板电脑。应该很好用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-04
    • 2015-05-29
    • 2012-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多