在android中的自定义图片视图上绘制

用户名

我正在开发绘图应用程序。而且我已经创建了一个绘图视图,允许用户在该视图上绘图。

问题是,当我在其上绘制时,它超出了图像的区域(请参考图片,黄线超出了实际的照片区域),如何将画布大小粘贴到实际的图像上?

以及imageview如何缩放?这意味着,当用户单击笔按钮时,它将进行绘制;当用户再次单击时,它将变为缩放功能。

谢谢。缩放功能可以稍后解决,并且超出区域的问题需要首先解决

在此处输入图片说明

这是xml中的自定义绘制视图

  <com.example.tool.DrawView
        android:id="@+id/draw"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

这是java

public class DrawView extends ImageView {

    private int color = Color.BLACK;
    private float width = 4f;
    private List<Holder> holderList = new ArrayList<Holder>();

    private class Holder {      
        Path path;
        Paint paint;

        Holder(int color, float width) {
            path = new Path();
            paint = new Paint();
            paint.setAntiAlias(true);
            paint.setStrokeWidth(width);
            paint.setColor(color);
            paint.setStyle(Paint.Style.STROKE);
            paint.setStrokeJoin(Paint.Join.ROUND);
            paint.setStrokeCap(Paint.Cap.ROUND);
        }
    }

    public DrawView(Context context) {
        super(context);
        init();
    }

    public DrawView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public DrawView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        init();
    }

    private void init() {
        holderList.add(new Holder(color, width));
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        for (Holder holder : holderList) {
            canvas.drawPath(holder.path, holder.paint);
        }
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        float eventX = event.getX();
        float eventY = event.getY();

        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                holderList.add(new Holder(color,width));
                holderList.get(holderList.size() - 1).path.moveTo(eventX, eventY);
                return true;
            case MotionEvent.ACTION_MOVE:
                holderList.get(holderList.size() - 1).path.lineTo(eventX, eventY);
                break;
            case MotionEvent.ACTION_UP:
                break;
            default:
                return false;
        }

        invalidate();
        return true;
    }

    public void resetPaths() {
        for (Holder holder : holderList) {
            holder.path.reset();
        }
        invalidate();
    }

    public void setBrushColor(int color) {
        this.color = color;
    }

    public void setWidth(float width) {
        this.width = width;
    }
}

我称其为:

DrawView pic = findViewById(R.id.draw);
pic.setImageBitmap(bitmap);

非常感谢您的帮助

Lei Guo

首先计算显示的图像大小,然后将eventX和eventY钳位到显示图像的边界。代码如下:

   int imageViewH=imageView.getMeasuredHeight();//height of imageView
   int imageViewW =imageView.getMeasuredWidth();//width of imageView
   int drawableH =imageView.getDrawable().getIntrinsicHeight();//original height of underlying image
   int drawableW=imageView.getDrawable().getIntrinsicWidth();//original width of underlying image
   int displayH, displayW;  // the shown height and width of the picture.
   int leftX, rightX, topY, bottomY; // the shown edges of the picture.
   if (imageViewH/drawableH <= imageViewW/drawableW){
       displayW = drawableW*imageViewH/drawableH;//rescaled width of image within ImageView
       displayH = imageViewH;
       leftX = (imageViewW - displayW)/2; // left edge of the displayed image.
       rightX = leftX + displayW; // right edge of the displayed image.
       topY = 0; // top edg
       bottomY = displayH; // bottom edge.
   }else{
       displayH = drawableH*imageViewW/drawableH;//rescaled height of image within ImageView
       displayW = imageViewW;
       leftX = 0; // left edge of the displayed image.
       rightX = displayW; // right edge of the displayed image.
       topY = (imageViewH - displayH)/2; // top edg
       bottomY = topY + displayH; // bottom edge.
   }
   //TODO: clamp the eventX and eventY to the bound of leftX, rightX, topY, bottomY

注意:只有在ImageView具有已测量的高度和可绘制对象之后,才应使用该代码。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在Android中的自定义图片视图上撤消绘图

来自分类Dev

Android中自定义视图上的按钮面板

来自分类Dev

Android-在自定义地图上绘制GPS坐标

来自分类Dev

使用Android自定义视图实时绘制图

来自分类Dev

Android-测试自定义视图是否正确绘制?

来自分类Dev

Android的绘制自定义视图,如谷歌付费

来自分类Dev

Android:以编程方式绘制自定义视图

来自分类Dev

未在RecyclerView的最后一个视图上绘制自定义ItemDecoration

来自分类Dev

核心文字-在目标C的自定义视图上绘制简单文字

来自分类Dev

Android中的自定义键盘视图

来自分类Dev

Android中的自定义视图

来自分类Dev

在Android中旋转自定义视图

来自分类Dev

Android 4.4 KitKat中的某些用户无法绘制自定义视图

来自分类Dev

如何在Android中为自定义视图绘制边框?

来自分类Dev

将颜色属性从自定义视图传递到Android中的可绘制形状

来自分类Dev

Android 4.4 KitKat中的某些用户无法绘制自定义视图

来自分类Dev

自定义视图未在GridLayout中绘制

来自分类Dev

自定义视图到Toast中-不绘制

来自分类Dev

自定义视图未绘制

来自分类Dev

绘制多个自定义视图

来自分类Dev

自定义视图不会绘制位图

来自分类Dev

在自定义Eclipse视图中绘制

来自分类Dev

绘制自定义视图的正确方法?

来自分类Dev

从ODOO树视图上的“添加自定义过滤器” /“添加自定义组”中删除可选属性

来自分类Dev

在Google地图上绘制“自定义”圆

来自分类Dev

ANDROID:在自定义视图上移动文本不流畅

来自分类Dev

找不到使用资源的自定义视图上的Android InstrumentationTestCase

来自分类Dev

使用XML在android中绘制自定义形状

来自分类Dev

在Android中制作自定义可绘制形状

Related 相关文章

热门标签

归档