在Android的ImageView上如何画一条直线?

10

我想知道如何在ImageView上随着用户滑动手指来绘制一条直线?

有人能解释一下吗?或者提供任何开始的链接。


你想画某条线或者在上面做类似绘画的事情吗? - Mehul Ranpara
4个回答

10

你需要拥有自己的ImageView并重写onDraw函数。可以使用类似以下代码:

public class MyImageView extends ImageView{

    public MyImageView(Context context) {
        super(context);
        // TODO Auto-generated constructor stub
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        Paint p = new Paint(Paint.ANTI_ALIAS_FLAG);
        canvas.drawLine(0, 0, 20, 20, p);

    }

}

在您的主类中创建对象MyImageView;当您触摸屏幕时调用update();函数。


嗨乔治,你是指在onTouch()事件中调用update方法吗?很抱歉问了这么多问题,我还是个新手。 - user776550
没错,我是认真的。没问题,你可以问多少你想要的)) - George
你必须重写OnTouchListener,并在你的OnTouch函数中调用invalidate。 - George
我有同样的问题。我已经尝试过了,但对我来说没有用。实际上,我是新手在这个Android环境中。你能演示一下吗?还是我需要再次提出我的问题并附上所有的代码? - Dil Se...
1
好的。只需要进行3个更改 - 首先将Paint p添加为类的属性,然后在类构造函数中初始化它,最后将super.onDraw(canvas);移动到您的绘图操作之上。这将允许您在原始图像上进行绘制。 - Nux

9
这是一个完整的示例,展示了如何在另一张图片上绘制绿色矩形:
package CustomWidgets;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.util.AttributeSet;

/**
 * Allows to draw rectangle on ImageView.
 *
 * @author Maciej Nux Jaros
 */
public class DrawImageView extends ImageView {
    private Paint currentPaint;
    public boolean drawRect = false;
    public float left;
    public float top;
    public float right;
    public float bottom;

    public DrawImageView(Context context, AttributeSet attrs) {
        super(context, attrs);

        currentPaint = new Paint();
        currentPaint.setDither(true);
        currentPaint.setColor(0xFF00CC00);  // alpha.r.g.b
        currentPaint.setStyle(Paint.Style.STROKE);
        currentPaint.setStrokeJoin(Paint.Join.ROUND);
        currentPaint.setStrokeCap(Paint.Cap.ROUND);
        currentPaint.setStrokeWidth(2);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        if (drawRect)
        {
            canvas.drawRect(left, top, right, bottom, currentPaint);
        }
    }
}

当您定义了这个之后,您可以将ImageView替换为上面的View(小部件),例如:
<CustomWidgets.DrawImageView
    android:id="@+id/widgetMap"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:src="@drawable/map_small"
/>

然后,您可以在控制布局的活动的触摸事件中使用此示例:

    mapImageView.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            DrawImageView drawView = (DrawImageView) v;

            // set start coords
            if (event.getAction() == MotionEvent.ACTION_DOWN) {
                drawView.left = event.getX();
                drawView.top = event.getY();
            // set end coords
            } else {
                drawView.right = event.getX();
                drawView.bottom = event.getY();
            }
            // draw
            drawView.invalidate();
            drawView.drawRect = true;

            return true;
        }
    });

当然,你可以创建一些getter和setter以及其他Java过度工程化的例程。;-)

0

0

请查看 ApiDemos 示例FingerPaint

通过使用该示例,您可以通过触摸屏幕在 ImageView 上绘制直线。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接