我想做一个画板,现在需要增加一个插入图片功能。
目前能从相册中选取图片,但是因为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加到页面上吗?