Android:Canvas drawBitmap不起作用

时间:2018-06-07 21:08:27

标签: android canvas view

我正在尝试创建一个可以在位图上绘制的画布。我已经加载了位图,它没有任何问题。但是当我使用drawBitmap时,我只得到一个空白屏幕,而绘画和drawPath仍然有效。我已经尝试将位图直接传递给构造函数。请帮忙

public class DrawView extends View implements OnTouchListener {
private static final String TAG = "DrawView" ;
private Canvas mCanvas;
private Path mPath;
private Paint mPaint;
private ArrayList<Path> paths = new ArrayList<Path>();
private ArrayList<Path> undonePaths = new ArrayList<Path>();
final int defaultBrushSize = 10;

private Bitmap im;
public DrawView(Context context, Intent intent,String fileroot)
{
    super(context);
    setFocusable(true);
    setFocusableInTouchMode(true);
    this.setOnTouchListener(this);
    mPaint = new Paint();
    mPaint.setDither(true);

    mPaint.setColor(Color.parseColor("#000000"));

    mPaint.setStyle(Paint.Style.STROKE);

    mPaint.setStrokeJoin(Paint.Join.BEVEL);

    mPaint.setStrokeCap(Paint.Cap.SQUARE);

    mPaint.setAlpha(150);

    mPaint.setStrokeWidth(defaultBrushSize);



    FileInputStream in = null;
    try {
        in = new FileInputStream(fileroot+"/"+intent.getStringExtra("image")+".jpg");
        BufferedInputStream buf = new BufferedInputStream(in);
        byte[] bMapArray= new byte[buf.available()];
        Log.d(TAG, "onCreate: bMap array: " + bMapArray.toString());
        buf.read(bMapArray);
        im = BitmapFactory.decodeByteArray(bMapArray, 0, bMapArray.length).copy(Bitmap.Config.ARGB_8888, true);
        Log.d(TAG, "onCreate: bmap " + im);
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e){
        e.printStackTrace();
    }


    mPath = new Path();
    mCanvas = new Canvas();
    mCanvas.drawBitmap(im,null,new Rect(0,0,im.getWidth(),im.getHeight()),null);


}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
    super.onSizeChanged(w, h, oldw, oldh);
}

@Override
protected void onDraw(Canvas canvas) {

    for (Path p : paths){
        canvas.drawPath(p, mPaint);
    }
    canvas.drawPath(mPath, mPaint);
}

private float mX, mY;
private static final float TOUCH_TOLERANCE = 4;

private void touch_start(float x, float y) {
    undonePaths.clear();
    mPath.reset();
    mPath.moveTo(x, y);
    mX = x;
    mY = y;
}
private void touch_move(float x, float y) {
    float dx = Math.abs(x - mX);
    float dy = Math.abs(y - mY);
    if (dx >= TOUCH_TOLERANCE || dy >= TOUCH_TOLERANCE) {
        mPath.quadTo(mX, mY, (x + mX)/2, (y + mY)/2);
        mX = x;
        mY = y;
    }
}
private void touch_up() {
    mPath.lineTo(mX, mY);
    // commit the path to our offscreen
    mCanvas.drawPath(mPath, mPaint);
    // kill this so we don't double draw
    paths.add(mPath);
    mPath = new Path();

}

public void onClickUndo () {
    if (paths.size()>0)
    {
        undonePaths.add(paths.remove(paths.size()-1));
        invalidate();
    }
    else
    {

    }
    //toast the user
}

public void onClickRedo (){
    if (undonePaths.size()>0)
    {
        paths.add(undonePaths.remove(undonePaths.size()-1));
        invalidate();
    }
    else
    {

    }
    //toast the user
}

public void setSize(int s){
    mPaint.setStrokeWidth(s);
    invalidate();
}

@Override
public boolean onTouch(View arg0, MotionEvent event) {
    float x = event.getX();
    float y = event.getY();

    switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            touch_start(x, y);
            invalidate();
            break;
        case MotionEvent.ACTION_MOVE:
            touch_move(x, y);
            invalidate();
            break;
        case MotionEvent.ACTION_UP:
            touch_up();
            invalidate();
            break;
    }
    return true;
}

1 个答案:

答案 0 :(得分:0)

您无法在任何地方支持Canvas。只需调用新的Canvas而不在某处支持它,就会将绘制命令发送到黑洞中。通常,您将它们备份到内存中必须首先创建的Bitmap对象。所以,您希望使用canvas = new Canvas(bitmap);

另请注意,要在屏幕上显示任何内容,必须在onDraw函数期间将其绘制到传递给onDraw的Canvas中。因此,只需绘制一个随机的Canvas,无论是否支持,都不会将其绘制到屏幕上。