Reputation: 61
I have a problem to rotate bitmap on canvas ,I am drawing bitmap on canvas by using canvas.drawline and use following code to rotate image
It rotate but it shows two image now ?How to remove previous image from canvas? What to do?
bitmap = Bitmap.createBitmap((int) /*getWindowManager()
.getDefaultDisplay().getWidth()*/600, (int) /*getWindowManager()
.getDefaultDisplay().getHeight()*/600, Bitmap.Config.ARGB_8888 );
Canvas canvas = new Canvas(bitmap);
drawingImageView.setVisibility(View.VISIBLE);
drawingImageView.setImageBitmap(bitmap);
// canvas.rotate(90);
for(int i=0;i<SettingsStaticData.arrX1_crossPoint.size();i++)
{
canvas.drawLine(new Float(SettingsStaticData.arrX1_crossPoint.get(i)),new Float(SettingsStaticData.arrY1_crossPoint.get(i)),new Float(SettingsStaticData.arrX2_crossPoint.get(i)) ,new Float(SettingsStaticData.arrY2_crossPoint.get(i)), paint);
}
paint.setStrokeWidth((float) 0.9);
paint.setStyle(Paint.Style.FILL);
// paint.setColor(Color.RED);
paint.setColor(Color.parseColor("#800080"));
for(int i=0;i<arrXX.size()-1;i++)
{
if(i==arrXX.size()-2)
{
canvas.drawLine(new Float(arrXX.get(0)),new Float(arrYY.get(0)),new Float(arrXX.get(i+1)) ,new Float(arrYY.get(i+1)), paint);
canvas.drawLine(new Float(arrXX.get(i)),new Float(arrYY.get(i)),new Float(arrXX.get(i+1)) ,new Float(arrYY.get(i+1)), paint);
}
else
{
canvas.drawLine(new Float(arrXX.get(i)),new Float(arrYY.get(i)),new Float(arrXX.get(i+1)) ,new Float(arrYY.get(i+1)), paint);
}
}
// canvas.drawColor(0, Mode.CLEAR);
Matrix matrix = new Matrix();
matrix.reset();
matrix.postTranslate(-bitmap.getWidth() / 2-500, -bitmap.getHeight() / 2-500); // Centers image
matrix.postRotate(180);
//matrix.postTranslate(px, py);
canvas.drawBitmap(bitmap, matrix, null);
Upvotes: 0
Views: 2167
Reputation: 347
The problem is the last line: canvas.drawBitmap(bitmap, matrix, null);
canvas
is initialized with the bitmap
so you draw the bitmap on itself (with some changes).
Just create another Canvas canvas2
and change the last line to canvas2.drawBitmap(bitmap, matrix, null);
and display the last one drawingImageView.setImageBitmap(bitmap2);
where bitmap2 is the bitmap used to create canvas2.
So, explicitly:
bitmap = Bitmap.createBitmap((int) /*getWindowManager()
.getDefaultDisplay().getWidth()*/600, (int) /*getWindowManager()
.getDefaultDisplay().getHeight()*/600, Bitmap.Config.ARGB_8888 );
bitmapFinal = Bitmap.createBitmap((int) /*getWindowManager()
.getDefaultDisplay().getWidth()*/600, (int) /*getWindowManager()
.getDefaultDisplay().getHeight()*/600, Bitmap.Config.ARGB_8888 );
Canvas canvas = new Canvas(bitmap);
// canvas.rotate(90);
for(int i=0;i<SettingsStaticData.arrX1_crossPoint.size();i++){
canvas.drawLine(new Float(SettingsStaticData.arrX1_crossPoint.get(i)),
new Float(SettingsStaticData.arrY1_crossPoint.get(i)),
new Float(SettingsStaticData.arrX2_crossPoint.get(i)) ,
new Float(SettingsStaticData.arrY2_crossPoint.get(i)), paint);
}
paint.setStrokeWidth((float) 0.9);
paint.setStyle(Paint.Style.FILL);
// paint.setColor(Color.RED);
paint.setColor(Color.parseColor("#800080"));
for(int i=0;i<arrXX.size()-1;i++){
if(i==arrXX.size()-2){
canvas.drawLine(new Float(arrXX.get(0)),new Float(arrYY.get(0)),
new Float(arrXX.get(i+1)) ,new Float(arrYY.get(i+1)), paint);
canvas.drawLine(new Float(arrXX.get(i)),new Float(arrYY.get(i)),
new Float(arrXX.get(i+1)) ,new Float(arrYY.get(i+1)), paint);
}else{
canvas.drawLine(new Float(arrXX.get(i)),new Float(arrYY.get(i)),new Float(arrXX.get(i+1)) ,new Float(arrYY.get(i+1)), paint);
}
}
// canvas.drawColor(0, Mode.CLEAR);
Matrix matrix = new Matrix();
matrix.reset();
matrix.postTranslate(-bitmap.getWidth() / 2-500, -bitmap.getHeight() / 2-500); // Centers image
matrix.postRotate(180);
//matrix.postTranslate(px, py);
Canvas canvas2 = new Canvas(bitmapFinal);
canvas2.drawBitmap(bitmap, matrix, null);
drawingImageView.setVisibility(View.VISIBLE);
drawingImageView.setImageBitmap(bitmapFinal);
Also, my advice is to look for a better place to create the bitmaps - you don't really need to create a new bitmap every time - you should create them once and reuse (it is expensive to continually create bitmaps). I would sugest onCreate()
function for this purpose.
Upvotes: 2