【问题标题】:Draw onto an ImageView绘制到 ImageView
【发布时间】:2010-08-17 14:50:44
【问题描述】:

我已经研究了几个小时的 Androidreference,但并没有真正了解如何在 ImageView 上绘制一些东西(文本、位图、路径 ....)。

我应该扩展 View 并使用onDraw()-方法吗?如果是,我如何在 ImageView 上绘图?

或者还有其他方法可以实现我的目标吗?

【问题讨论】:

    标签: android drawing


    【解决方案1】:

    如果您只想在 ImageView 上绘制另一个位图并且它不应该是动态的,那么请使用 AbsoluteLayout 并将它们放在彼此之上。

    如果它应该更加动态,我建议使用 SurfaceView。教程可以在这里找到:http://www.droidnova.com/playing-with-graphics-in-android-part-i,147.html

    (目前仅通过网络存档在线:http://web.archive.org/web/20121005111921/http://www.droidnova.com/2d-tutorial-series

    【讨论】:

    • 嗯....他的 SurfaceView 下也没有任何东西,但我不想拥有 ImageView 也不想在其上动态绘制文本。有什么想法可以实现吗?
    • 您没有阅读本系列的所有部分,对吧?忘记 ImageView 并在 SurfaceView 上绘制位图。比在上面画你的文字。至少阅读前 3 部分!
    • 在我注意到本教程只是关于在 SurfaceView 上设置相同的图标/位图之后,我只运行了以下页面。但我完全阅读了前 3 部分!在前 3 部分中没有任何透支。他只是在他的 SurfaceView 上绘制他的图标....但我已经解决了这个问题,谢谢到目前为止。
    • 在位图上绘制位图很容易,只需使用相同的坐标即可。本教程的目标是展示如何使用 SurfaceView。顺便说一句,“他”就是我 :)
    • @WaynePhipps 我添加了一个 webarchive 链接,因为原始博客已离线并且我没有本地副本...
    【解决方案2】:

    是的,您可以使用 onDraw 方法。有一个 Canvas 对象传递到该方法中,您将使用它在视图上绘制。这是一个如何做到这一点的示例...取自斑马线条形码扫描仪应用程序。它是显示深色外框、红色扫描线和黄色扫描结果点的视图。

    @Override
    public void onDraw(Canvas canvas) {
        Rect frame = CameraManager.get().getFramingRect();
        if (frame == null) {
          return;
        }
        int width = canvas.getWidth();
        int height = canvas.getHeight();
        Log.v("ViewfinderView", "Canvas size: " + width + ", " + height);
    
        // Draw the exterior (i.e. outside the framing rect) darkened
        paint.setColor(resultBitmap != null ? resultColor : maskColor);
        canvas.drawRect(0, 0, width, frame.top, paint);
        canvas.drawRect(0, frame.top, frame.left, frame.bottom + 1, paint);
        canvas.drawRect(frame.right + 1, frame.top, width, frame.bottom + 1, paint);
        canvas.drawRect(0, frame.bottom + 1, width, height, paint);
    
        if (resultBitmap != null) {
          // Draw the opaque result bitmap over the scanning rectangle
          paint.setAlpha(OPAQUE);
          canvas.drawBitmap(resultBitmap, frame.left, frame.top, paint);
        } else {
    
          // Draw a two pixel solid black border inside the framing rect
          paint.setColor(frameColor);
          canvas.drawRect(frame.left, frame.top, frame.right + 1, frame.top + 2, paint);
          canvas.drawRect(frame.left, frame.top + 2, frame.left + 2, frame.bottom - 1, paint);
          canvas.drawRect(frame.right - 1, frame.top, frame.right + 1, frame.bottom - 1, paint);
          canvas.drawRect(frame.left, frame.bottom - 1, frame.right + 1, frame.bottom + 1, paint);
    
          // Draw a red "laser scanner" line through the middle to show decoding is active
          paint.setColor(laserColor);
          paint.setAlpha(SCANNER_ALPHA[scannerAlpha]);
          scannerAlpha = (scannerAlpha + 1) % SCANNER_ALPHA.length;
          int middle = frame.height() / 2 + frame.top;
          canvas.drawRect(frame.left + 2, middle - 1, frame.right - 1, middle + 2, paint);
    
          Collection<ResultPoint> currentPossible = possibleResultPoints;
          Collection<ResultPoint> currentLast = lastPossibleResultPoints;
          if (currentPossible.isEmpty()) {
            lastPossibleResultPoints = null;
          } else {
            possibleResultPoints = new HashSet<ResultPoint>(5);
            lastPossibleResultPoints = currentPossible;
            paint.setAlpha(OPAQUE);
            paint.setColor(resultPointColor);
            for (ResultPoint point : currentPossible) {
              canvas.drawCircle(frame.left + point.getX(), frame.top + point.getY(), 6.0f, paint);
            }
          }
          if (currentLast != null) {
            paint.setAlpha(OPAQUE / 2);
            paint.setColor(resultPointColor);
            for (ResultPoint point : currentLast) {
              canvas.drawCircle(frame.left + point.getX(), frame.top + point.getY(), 3.0f, paint);
            }
          }
    
          // Request another update at the animation interval, but only repaint the laser line,
          // not the entire viewfinder mask.
          postInvalidateDelayed(ANIMATION_DELAY, frame.left, frame.top, frame.right, frame.bottom);
        }
      }
    

    【讨论】:

    • 感谢您的示例,这有点矫枉过正,但让我知道了如何实现我的目标。
    • 是的,那里有很多...这只是我碰巧手边的一些来源。如果它真的对你有帮助,别忘了点击小复选标记:)
    • 嗯,Fredley 提供的 Surface View 提示也很棒,WarrenFaith 提供的教程链接也不错,所以我无法决定谁应该获得复选标记 :)
    【解决方案3】:

    SurfaceView 是你想要的。它会给你一个Canvas 对象,你可以使用canvas.drawCircle(...)canvas.drawText(...)canvas.drawBitamp(...) 在其上绘图。

    【讨论】:

    • 好的,谢谢,我会阅读 SurfaceView 的参考资料,我想我将能够实现我的目标
    • 我怎样才能让我的 ImageView(在基于 XML 的布局中声明)在 SurfaceView 下,这样我就可以在它上面画图了?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多