Растровое изображение не рисуется на холсте-андроиде
Я хочу загружать изображения из галереи в свой CustomView, не изменяя их соотношение сторон, а затем я хочу рисовать на них.
У меня есть собственное представление, которое я добавил динамически из MainActivity следующим образом:
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(data!=null && requestCode==PICK_PHOTO_CODE)
{
Uri photoUri=data.getData();
Glide.with(context).asBitmap().load(photoUri).into(new CustomTarget<Bitmap>() {
@Override
public void onResourceReady(@NonNull Bitmap resource, @Nullable Transition<? super Bitmap> transition) {
source_bitmap=resource;
RelativeLayout rL=findViewById(R.id.relative);
CustomView customView=new CustomView(getApplicationContext(),source_bitmap);
RelativeLayout.LayoutParams params=new RelativeLayout.LayoutParams(source_bitmap.getWidth(),source_bitmap.getHeight());
customView.setLayoutParams(params);
rL.addView(customView);
}
@Override
public void onLoadCleared(@Nullable Drawable placeholder) {
}
});
}
}
И это мой класс CustomView:
public class CustomView extends View {
Context context;
Bitmap source_bitmap;
Bitmap bitmap;
Canvas mCanvas;
public CustomView(Context context, Bitmap sourceBitmap) {
super(context);
this.context=context;
this.source_bitmap=sourceBitmap;
init();
}
public void init()
{
}
@Override
protected void onSizeChanged(int w, int h, int oldW, int oldH) {
super.onSizeChanged(w, h, oldW, oldH);
bitmap=Bitmap.createBitmap(source_bitmap.getWidth(),source_bitmap.getHeight(), Bitmap.Config.ARGB_8888);
mCanvas=new Canvas(bitmap);
mCanvas.drawBitmap(source_bitmap,0,0,null);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
mCanvas.drawBitmap(bitmap,0,0,null);
}
}
Проблема в том, что битмап изображения, выбранного из Галереи, не рисуется на нем, и я не могу понять, в чем проблема. Кто-нибудь может помочь?
1 ответ
Проблема заключалась в методе onDraw, для рисования должен использоваться переданный холст, т.е. холст, а не mCanvas. Так,
Вместо
mCanvas.drawBitmap(bitmap,0,0,null);
использовать
canvas.drawBitmap(bitmap,0,0,null);
Только тогда мы сможем увидеть результаты. В первом случае он обязательно отрисовывается, но холст, связанный с пользовательским представлением, — это холст, а не mCanvas. Это мое понимание. Если вы найдете что-то неправильное, сделайте комментарий.