Android 将图形添加到现有视图

Android 将图形添加到现有视图,android,Android,例如,如何向已绘制的视图添加线 我试着从draw方法中抓取画布并使用它来绘制,但它似乎不起作用 protected void onDraw(Canvas canvas) { super.onDraw(canvas); mCanvas = canvas; //drawing code here } public boolean onTouchEvent(MotionEvent event) { switch (event.getAction()) {

例如,如何向已绘制的视图添加线

我试着从draw方法中抓取画布并使用它来绘制,但它似乎不起作用

protected void onDraw(Canvas canvas) {

   super.onDraw(canvas);
   mCanvas = canvas;
       //drawing code here
}

 public boolean onTouchEvent(MotionEvent event) {

    switch (event.getAction()) {
       case MotionEvent.ACTION_DOWN: {
             Paint paint = new Paint();
             paint.setColor(Color.BLACK);
             paint.setStrokeWidth(10);
             paint.setStyle(Style.FILL);
             mCanvas.drawLine(0, 0, 50, 50, paint);
      }
   }

 }

执行以下步骤:

  • 如果您只想绘制静态对象,请将一个成员变量设置为布尔标志,并在触发
    ACTION\u DOWN
    时将其设置为true
  • (对于动态内容:保存坐标供以后使用)
  • 在案例块中进行
    invalidate()
    调用
  • onDraw()
    中,如果标志为真,则画线
  • 编辑

    您需要了解绘图过程,才能理解为什么保存画布对象不起作用。 Android使用两个翻转的缓冲区(命名为缓冲区A和B)。始终在不可见的缓冲区上绘制。完成绘制后,缓冲区将被切换,您将看到所绘制的内容。基本上,画布将被锁定(以防止在后缓冲区上绘制时翻转),并且该画布对象将提供给请求重画的每个视图。在此之后,画布将解锁,从而触发缓冲区切换。在那一刻,这个画布对象可能仍然在那里,但你在上面画的每一幅画都不会显示出来


    更多信息可以在我的博客上找到

    你想做的事情最好是使用。基本上,drawable是一个封装图形信息的对象,这些信息可以更新并易于重用。i、 e

    public class LineDrawable extends Drawable {
    private int mStartX;
    
    private int mStartY;
    
    private int mEndX;
    
    private int mEndY;
    
    private final Paint mPaint;
    
    public LineDrawable() {
        mPaint = new Paint();
        mPaint.setColor(Color.RED);
    }
    
    public void setLineCoordinates(final int startX, final int startY,
            final int endX, final int endY) {
        mStartX = startX;
        mStartY = startY;
        mEndX = endX;
        mEndY = endY;
    }
    
    public void setColor(final int color){
        mPaint.setColor(color);
    }
    
    @Override
    public void setColorFilter(final ColorFilter colorFilter) {
        mPaint.setColorFilter(colorFilter);
    }
    
    @Override
    public void setAlpha(final int alpha) {
        mPaint.setAlpha(alpha);
    }
    
    @Override
    public void draw(final Canvas canvas) {
        canvas.drawLine(mStartX, mStartY, mEndX, mEndY, mPaint);
    }
    
    @Override
    public int getOpacity() {
        return PixelFormat.OPAQUE;
    }
    
    public void setSize(final int size){
        mPaint.setStrokeWidth(size);
    }
    }
    
    public class YourView extends View{
    private LineDrawable mLineDrawable;
    
        public YourView(final Context context){
            mLineDrawable = new LineDrawable();
        }
    
    .......
    
    @Override
    protected void onDraw(final Canvas canvas){
        super.onDraw(canvas);
        mLineDrawable.draw(canvas);
    }
    
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        switch (event.getAction()) {
           case MotionEvent.ACTION_DOWN: {
               mLineDrawable.setColor(Color.BLUE);
               mLineDrawable.setLineCoordinates(0, 0, event.getX(), event.getY());
           }
         }
    }
      }
    

    对于糟糕的格式设置,很抱歉,粘贴它似乎把它搞砸了。

    尝试在视图上调用invalidate()。确定。所以我需要在onDraw()方法中执行所有操作。没有办法在它之外添加绘图?没有,要理解为什么你应该理解android的绘图过程。我会更新我的答案,简单解释一下。谢谢。我也会用这个。但是,如果我,比如说,想为拉伸线添加控制柄,我仍然需要在这个视图的onDraw()方法中操纵这个视图,就像上面提到的WarrenFaith一样。此外,还需要在onTouchEvent的末尾调用this.invalidate()来取消绘制线。是的,这里也需要调用invalidate,我的错是漏掉了它。如果您想添加句柄-这应该是另一个具有适当onTouchListener集的视图。