在android上绘制图片

问题描述 投票:4回答:3

我正在使用可在其上画线的自定义imageview,问题是绘图区域的大小与位图的大小不完全相同。

例如,在另一个应用程序中,它看起来像:

<< img src =“ https://image.soinside.com/eyJ1cmwiOiAiaHR0cHM6Ly9pLnN0YWNrLmltZ3VyLmNvbS9aVWFEVC5wbmcifQ==” alt =“在此处输入图像描述”>

但是,在我的应用中,它看起来像

“在此处输入图像描述”

这是我的程序,看来位图与画布不匹配。感谢您的帮助

   public class DrawingView extends View {

    //drawing path
    private Path drawPath;
    //drawing and canvas paint
    private Paint drawPaint, canvasPaint;
    //initial color
    private int paintColor = 0xFF660000;
    //canvas
    private Canvas drawCanvas;
    //canvas bitmap
    private Bitmap canvasBitmap;


    public DrawingView(Context context, AttributeSet attrs){
        super(context, attrs);
        setupDrawing();
    }

    //setup drawing
    private void setupDrawing(){

        //prepare for drawing and setup paint stroke properties
        drawPath = new Path();
        drawPaint = new Paint();
        drawPaint.setColor(paintColor);
        drawPaint.setAntiAlias(true);
        drawPaint.setStrokeWidth(15.0f);
        drawPaint.setStyle(Paint.Style.STROKE);
        drawPaint.setStrokeJoin(Paint.Join.ROUND);
        drawPaint.setStrokeCap(Paint.Cap.ROUND);
        canvasPaint = new Paint(Paint.DITHER_FLAG);
    }

    //size assigned to view
    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        super.onSizeChanged(w, h, oldw, oldh);
        canvasBitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
        drawCanvas = new Canvas(canvasBitmap);
    }

    //draw the view - will be called after touch event
    @Override
    protected void onDraw(Canvas canvas) {
        canvas.drawBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher), 0, 0, canvasPaint);
        canvas.drawBitmap(canvasBitmap, 0, 0, canvasPaint);
        canvas.drawPath(drawPath, drawPaint);
    }

    //register user touches as drawing action
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        float touchX = event.getX();
        float touchY = event.getY();
        //respond to down, move and up events
        switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            drawPath.moveTo(touchX, touchY);
            break;
        case MotionEvent.ACTION_MOVE:
            drawPath.lineTo(touchX, touchY);
            break;
        case MotionEvent.ACTION_UP:
            drawPath.lineTo(touchX, touchY);
            drawCanvas.drawPath(drawPath, drawPaint);
            drawPath.reset();
            break;
        default:
            return false;
        }
        //redraw
        invalidate();
        return true;

    }

    //update color
    public void setColor(String newColor){
        invalidate();
        paintColor = Color.parseColor(newColor);
        drawPaint.setColor(paintColor);
    }

    //start new drawing
    public void startNew(){
        drawCanvas.drawColor(0, PorterDuff.Mode.CLEAR);
        invalidate();
    }
}

并且我发现了类似的教程代码,问题是touch事件有bug,它计入操作栏和其余的UI元素,所以触摸很奇怪。推荐看看

http://www.java2s.com/Code/Android/2D-Graphics/DrawonPictureandsave.htm

所以,本主题的目标是]的解决方案>

1)可绘制图像

2)可缩放和平移(可使用库)(当激活缩放,缩放,非激活缩放,绘制时)

可以参考该截图1的想法

非常感谢您的帮助

我正在使用可在其上画线的自定义imageview,问题是绘图区域的大小与位图的大小不完全相同。例如,在另一个应用程序中,它看起来像:但是,...

android android-layout canvas android-imageview
3个回答
16
投票

您可以通过创建自己的ImageView来避免计算示例中其他UI项的坐标。尝试将此代码用于Activity


0
投票

请看一下


0
投票

相同的KOTLIN解决方案(使用anilanswer)

© www.soinside.com 2019 - 2024. All rights reserved.