【问题标题】:Draw shapes dynamic动态绘制形状
【发布时间】:2015-05-27 13:20:16
【问题描述】:

我正在开发一个技术绘图应用程序,我需要添加一些工具来绘制线、圆、矩形和角。现在我可以画线和手绘,但不能画圆、矩形和角。我在很多网站上找到了如何绘制它但是静态的,我的意思是,在您预设的位置或您触摸的位置绘制形状,但我需要知道如何绘制,例如在我的位置绘制一个圆圈触摸并使它比我分开手指时更大。我希望你明白我的意思。

【问题讨论】:

  • 你应该阅读手势
  • 我不知道如何实现手势来绘制。你知道任何教程或什么的吗?谢谢。

标签: android canvas


【解决方案1】:

你可以有两个变量 x 和 y,然后每次触摸屏幕时将 x 和 y 设置为该值,同时绘制坐标 x 和 y 的圆。

如果您正在绘图并且只想保留一个绘制的圆圈,您可以绘制圆圈并将其添加到画布中的 x 和 y 上,然后下次触摸屏幕时,将在 x 和 y 上绘制一个新的圆圈y 和旧的将保持绘制状态。

你在使用Canvas 吗?如果是这样,您可以了解如何做到这一点here (Canvas documentation)here (Bitmap documentation)。根据您的情况,您可以创建一个新的Bitmap 并将其分配给Canvas,然后在Canvas 上绘制,在您的位图中,您将拥有所需的圆圈和其他形状,在下一个绘图框架上,绘制新形状并更改将保留。

编辑:为了使动态半径遵循此逻辑,当您触摸屏幕时,将 x 和 y 设置为该点(圆心),同时在屏幕上移动手指,计算与 x 比较的半径和 y,当你抬起手指时,如上所述在位图上应用绘图。

一些代码:

public boolean onTouchEvent(MotionEvent e)
{
    switch (e.getAction())
    {
        case MotionEvent.ACTION_DOWN:
            x = (int) event.getX();
            y = (int) event.getY();
            break;
        case MotionEvent.ACTION_MOVE:
            //If I'm not wrong this is how to calculate radius,
            //I'm at work and can't test this now, you can use your way
            int distanceX = (int) event.getX() -x;
            int distanceY = (int) event.getY() -y;
            radius = sqrt(distanceX *distanceX + distanceY *distanceY);
            break;
        case MotionEvent.ACTION_UP:
            //Draw circle inside your bitmap here

            //This is like a flag to notify the program that no new shape is being drawn
            x = -1;
            break;
}

public void draw(Canvas canvas)
{
    canvas.drawBitmap(myBitmap, 0, 0, null);

    //A new shape is being drawn
    if (x != -1)
        //In here you place a switch to decide which shape you are drawing
        //for this example i assume circle
        canvas.drawCircle(radius, x, y, paint);
}

当您抬起手指时,应该在位图上绘制新圆圈,这样您就不必为每个新圆圈添加额外的代码。

Edit2:我将使用我描述的BitmapCanvas 方法添加更多代码。

Bitmap myBitmap;
Canvas myCanvas;

//Constructor
public myActivity(Bundle bundle) //or whatever your constructor is
{
    myBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
    myCanvas = new Canvas(myBitmap);
}

现在,当ACTION_UP 激活在draw 函数上绘制的“myCanvas”上的绘制圆圈时,您在“myCanvas”上绘制的任何内容都将应用于“myBitmap”。

case MotionEvent.ACTION_UP:
    myCanvas.drawCircle(radius, x, y, paint);

    x = -1;
    break;

【讨论】:

  • 我正在使用画布。我正在阅读,现在我可以画圆,但我想用动态半径制作它。我读了link,但我无法绘制没有球的矩形。有什么想法吗?
  • @AbelSuviri 我用更多解释编辑了我的答案
  • 我测试了您的代码,并对其进行了一些更改以适合我的代码,但它无法正常工作。我在屏幕左侧总是有一个大圆圈,我无法将其移动到该位置,当我停止触摸屏幕时,我在触摸的位置出现一个小圆圈,大圆圈消失
  • @AbelSuviri 大圆圈一定意味着您在不触摸屏幕的情况下绘制形状,在我的代码中我设置x = -1 当用户从屏幕上抬起手指然后在绘制功能上我测试@ 987654336@ 检查用户是否正在触摸屏幕(你只想画圆圈)你做对了吗?
  • 我使用你的代码没有做任何改变,只检查我是否选择画一个圆圈并且它有效。问题是我不能在画布上画圆。我尝试添加 invalidate() 但无法继续绘制。
猜你喜欢
  • 2012-05-27
  • 2021-07-30
  • 1970-01-01
  • 1970-01-01
  • 2018-09-24
  • 2023-03-22
  • 2013-11-17
  • 2023-03-28
  • 1970-01-01
相关资源
最近更新 更多