在ImageView上绘图

时间:2017-06-29 11:28:07

标签: android canvas imageview ondraw

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

当我使用一个布局时,图像出现在TOP LEFT CORNER中,我可以毫无问题地在它上面绘图。

enter image description here

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

enter image description here

在我的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之上或至少在整个屏幕上拉伸?

3 个答案:

答案 0 :(得分:1)

Canvas原点与ImageView scaleType或gravity之间没有关系。

Canvas的X,Y原点始终位于View的左上角,如果您想在View的其他部分绘制,则需要自己翻译坐标。

<强> ADDED 首先要理解的是,画布不仅可以在您选择的图像上绘制所有视图。

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

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

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

答案 1 :(得分:0)

for,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>

答案 2 :(得分:0)

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