为什么用drawBitmap图片还是显示不出来。

我想做一个画板,现在需要增加一个插入图片功能。
目前能从相册中选取图片,但是因为onDraw方法没被调用,所以显示不出来。
需要怎么做才行?网上查的setWillNotDraw(false);也没用
log显示结果
E/TAG: 宽291高295mSrcRectRect(0, 0 - 291, 295)mDestRectRect(0, 0 - 291, 295)

  public class DrawBitmapView extends View{
private Paint mBitPaint;
private Bitmap mBitmap;
private int mBitWidth,mBitHeight;
private Rect mSrcRect,mDestRect;

public DrawBitmapView(Context context,int width,int height,Bitmap bitmap) {
    super(context);
    initPaint();
    mBitWidth = width;
    mBitHeight = height;
    mBitmap = bitmap;
    mSrcRect = new Rect(0,0,mBitWidth,mBitHeight);
    mDestRect = new Rect(0,0,mBitWidth,mBitHeight);
    Log.e("TAG", "宽"+mBitWidth+"高"+mBitHeight+"mSrcRect"+mSrcRect+"mDestRect"+mDestRect);

    setWillNotDraw(false);
}
protected void onDraw(Canvas canvas){
    super.onDraw(canvas);
    canvas.drawBitmap(mBitmap,mSrcRect,mDestRect,mBitPaint);
    //canvas.drawBitmap(mBitmap,0,0,mBitPaint);
}
private void initPaint() {
    mBitPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
    mBitPaint.setFilterBitmap(true);
    mBitPaint.setDither(true);
}
}

下面是在MainActivity.java里的代码

    public static final int CHOOSE_PHOTO = 0;
private void openAlbum(){
    Intent intent = new Intent("android.intent.action.GET_CONTENT");
    intent.setType("image/*");
    startActivityForResult(intent,CHOOSE_PHOTO);
}
public  void onRequestPermissionsResult(int requestCode,String[] permission,int[] grantResults){
    switch(requestCode){
        case 1:
            if(grantResults.length>0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){
                openAlbum();
            }
            else {
                Toast.makeText(this,"You denied the permission",Toast.LENGTH_SHORT);
            }
            break;
            default:
    }
}
    protected void onActivityResult(int requestCode,int resultCode,Intent data){
    switch (requestCode){
        case CHOOSE_PHOTO:
            if(resultCode == RESULT_OK){
                Bitmap bitmap = null;

                int mbitWidth,mbitHeight;

                //判断手机系统版本号
                if(Build.VERSION.SDK_INT >= 19){
                    //4.4及以上系统使用这个方法处理图片
                    bitmap = ImgUtil.handleImageOnKitKat(this,data);
                    mbitWidth = bitmap.getWidth();
                    mbitHeight = bitmap.getHeight();
                    drawBitmapView = new DrawBitmapView(this,mbitWidth,mbitHeight,bitmap);

                }
            }
            break;
            default:
                break;
    }
}

尝试一下把继承ImageView改成了继承View,就能够正常显示了。
原文:https://blog.csdn.net/feiniao8651/article/details/39483017
希望对你有用

onDraw咋会不执行,看下你宽高是不是有问题哦?log打下你的自定义img的宽高

重绘invaluate()试试,看看有没有走ondraw方法,如果走了就看看onmeasure里面的宽高是否正常

重绘invaluate()试试,看看有没有走ondraw方法,如果走了就看看onmeasure里面的宽高是否正常

1、onDraw是在View初化完成之后开始调用
2、postInvalidate()是重绘的,也就是调用postInvalidate()后系统会重新调用onDraw方法画一次

onDraw实例:
Java code
@Override

public void onDraw(Canvas canvas) {

// 首先定义一个paint

Paint paint = new Paint();

// 绘制矩形区域-实心矩形

// 设置颜色

paint.setColor(Color.WHITE);

// 设置样式-填充

paint.setStyle(Style.FILL);

// 绘制一个矩形

canvas.drawRect(new Rect(0, 0, getWidth(), getHeight()), paint);

// 绘空心矩形

// 设置颜色

paint.setColor(Color.RED);

// 设置样式-空心矩形

paint.setStyle(Style.STROKE);

// 绘制一个矩形

canvas.drawRect(new Rect(10, 10, 50, 20), paint);

// 绘文字

// 设置颜色

paint.setColor(Color.GREEN);

// 绘文字

canvas.drawText(str, 30, 30, paint);

// 绘图

// 从资源文件中生成位图

Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.icon);

// 绘图

canvas.drawBitmap(bitmap, 10, 10, paint);

}

构造函数写的 有问题吧 一般要写两个构造(一个参数和两个参数的)

在自定义控件初始化时加入这句话试试

setWillNotDraw(false);

麻烦多贴点代码,整体的使用流程,这点代码看不出问题。

drawBitmapView = new DrawBitmapView(this,mbitWidth,mbitHeight,bitmap);
你new 了个DrawBitmapView,但是没看到你MainActivity中把它放到哪个布局里啊,你有把它通过addView加到页面上吗?