在android canvas中绘制外部绘制方法

时间:2014-02-10 11:58:26

标签: android canvas android-canvas

我想从外部绘制方法绘制文本和特定画布中的线条是否有任何绘制方法。 例如.in my case

public void onDraw(Canvas canvas)
{
    canvas.drawBitmap(mBitmap, 0, 0, mBitmapPaint);
    canvas.drawPath(mPath, mPaint);
}

draw()
{
    /***  my drawing stuff ***/
}

建议一些示例代码以摆脱此错误

3 个答案:

答案 0 :(得分:0)

创建一些String对象并设置它们的值。最后在视图上调用invalidate()

String text;
public void onDraw(Canvas canvas)
  {

    canvas.drawBitmap(mBitmap, 0, 0, mBitmapPaint);
    canvas.drawPath(mPath, mPaint);
    canvas.drawText(text, x, y, mPaint);//this will draw what text's current value is
   }


public void draw(){
text="yr text";//change the value 
invalidate();//this will refresh the view.
}

您还可以查看表面视图。哪种更适合这种要求。 http://developer.android.com/reference/android/view/SurfaceView.html

答案 1 :(得分:0)

您可以在屏幕外位图上执行所有绘图,而只需在OnDraw调用中使用该位图更新画布。

这将是这样的。

public void drawShape(){
    mCanvas.setBitmap(mBitmapOffscreen);

    // all draw calls can be placed here or any other method
    // e.g.
    mCanvas.drawColor(0xaaaaaa);
    Path path = new Path();
    path.moveTo(500, 500);
    path.quadTo(150, 150, 30, 10);
    mCanvas.drawPath(path, mPaint);
}

// after all above invalidate() will eventually call onDraw()
// this will put your offscreen bitmap on the view
@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    mCanvas = canvas;

    if (mBitmap != null) {
        mCanvas.drawBitmap(mBitmapOffscreen, 0, 0, mBitmapPaint);
    }
}

答案 2 :(得分:0)

是的,您必须使用onDraw()方法来获取 Canvas 。而且您需要 Canvas 几乎可以做任何事情。

您可能会想将画布保存到更高级别的变量中并在以后使用。但这可能会导致某些意想不到的行为,很难调试。因此,除非您是Romain Guy,否则请不要尝试(我知道他不会这样做!)。

是的,必须做一个小部件的子类,重写onDraw()方法,并把这个混乱只做一次,这是最痛苦的事情 !但这就是我们生活的世界。事件驱动的编程就是这样。

这是一个快速版本:

[文件MyButton.java]

public class MyButton extends Button {
    public boolean myOneTimeConditionIsTrue = false; // will be set true when the condition is just right

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        if (myOneTimeConditionIsTrue) {
            myOneTimedrawStuff(canvas);
        }
    }

    private void myOneTimedrawStuff(Canvas canvas) {
        // do my stuff
    }
}

然后,您必须更改XML,以便它使用NEW小部件而不是通常的可疑对象。

[文件my_layout.xml]

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <com.mypackage.MyButton
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="click me"
        />

</FrameLayout>

是的,这需要很多工作,但是您会习惯的。如果有更简单的方法可以做到这一点,我很想听听。