【问题标题】:Drawing on the ImageView在 ImageView 上绘图
【发布时间】:2017-06-29 11:28:07
【问题描述】:

我正在尝试在 ImageView 上绘图(就像一个简单的油漆,但只是在图像上)。我创建了一个自定义 MyImageView 类,它扩展了我覆盖 onDraw 的 ImageView。我希望 ImageView 位于屏幕的中心。

当我使用一种布局时,图像出现在左上角,我可以毫无问题地在其上绘制。

当我使用不同的布局时,图像出现在屏幕的中心但是画布仍然是左上角的这个小矩形。因此,当我尝试在图像上绘制时,我只能在左上角进行绘制,并且更改出现在图像的中心。

在我的 MainActivity 我设置:

myImageView = (MyImageView) findViewById(R.id.pdfView);

// I also extract the bitmap myBitmap from the pdf ...
// and pass it to the ImageView
myImageView.setImageBitmap(myBitmap);

// and I set the Canvas too:
Canvas myCanvas = new Canvas(myBitmap);
myImageView.setMyCanvas(myCanvas);

那么这里是 MyImageView 的关键部分:

public class MyImageView extends 
    android.support.v7.widget.AppCompatImageView {

    // variables...

    public MyImageView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        setupDrawing();
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        canvas.drawPath(drawPath, drawPaint);
    }

    private void setupDrawing() { //...usual stuff here }

    @Override
    public boolean onTouchEvent(MotionEvent event) { //...usual stuff here }

    public void setMyCanvas(Canvas canvas) { this.myCanvas = canvas; }

我是否必须在 MyImageView 或 MainActivity 中添加/更改某些内容,以便画布仅位于 ImageView 顶部或至少延伸到整个屏幕?

【问题讨论】:

  • 你能在这里添加你的 onDraw() 方法的代码吗?你有硬编码值吗?此外,第二种情况看起来您已将图像视图的宽度和高度设置为 match_parent,这就是您将完整区域作为画布的原因。
  • 我认为将 android:gravity="center" 添加到您的线性布局应该可以使其按需要工作。

标签: android canvas imageview ondraw


【解决方案1】:

Canvas 原点与 ImageView 的 scaleType 或重力没有关系。

Canvas 的 X、Y 原点始终是 View 的左上角,如果要在 View 的其他部分进行绘制,则需要自己平移坐标。

添加 首先要了解的是,画布不仅用于在您选择的图像上绘制所有视图。

要使路径图居中,您需要在 onDraw 中执行类似的操作

canvas.save();
canvas.translate( (getWidth() - pathWidth) / 2, (getHeight() - pathHeight) / 2);
canvas.drawPath(drawPath, drawPaint);
canvas.restore();

算术问题不仅仅是编程问题。

【讨论】:

  • 我更新了我的问题,你能详细说明一下你的答案吗?
  • 谢谢。在这种情况下 pathWidth 和 pathHeight 是什么?
  • 您在代码中使用的 drawPath 宽度和高度,如果您创建了它,您应该知道它的尺寸。
【解决方案2】:

因为,ImageView 位于屏幕的中心。修改你的布局如下

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        android:gravity="center"
        android:background="#EEEEEE">

        <com.example.android.samplepaint.MyImageView
            android:id="@+id/pdfView"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:scaleType="fitXY"
            android:layout_gravity="center_horizontal"
            android:background="@android:color/white" />
</LinearLayout>

【讨论】:

    【解决方案3】:

    我认为原因在于您的布局选择。因为屏幕适配的问题,每个布局都需要绑定元素,有的布局默认是左上角。

    【讨论】:

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