簡體   English   中英

Android:Canvas drawBitmap不起作用

[英]Android: Canvas drawBitmap doesn't work

我正在嘗試創建一個可以在位圖上繪制的畫布。 我已經加載了位圖,並且沒有問題。 但是,當我使用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;
}

您不會在任何地方支持Canvas。 只需調用新的Canvas,而不將其備份到某個地方,就將繪制命令發送到一個黑洞中。 通常,將它們備份到必須首先創建的內存位圖對象中。 所以在這里您要使用canvas = new Canvas(bitmap);

還要注意,要使任何內容顯示在屏幕上,必須將其繪制到onDraw函數中傳遞給onDraw的Canvas上。 因此,僅繪制到具有或沒有支持的隨機Canvas不會將其繪制到屏幕上。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM