[英]Rotating image results in java.lang.NullPointerException after a number of rotations
在我的應用程序中,它具有使button
每次按下時將bitmap
旋轉90度的功能。 我還有另一個button
,它執行相同的操作,但是將bitmap
旋轉-90度。
我的問題是,當我按下旋轉buttons
約4至6次后,每張圖片按任何順序變化都會出現錯誤:
`java.lang.NullPointerException`: Attempt to invoke virtual method 'int android.graphics.Bitmap.getWidth()' on a null object reference.
當旋轉fxn頭幾次正常工作時,為什么會發生此錯誤? 我注意到,每次按下旋轉button
時,位圖的寬度和高度都會增加,但是如果它們大於imageview
,那不會使應用程序崩潰。 我嘗試了多種其他方法,但它們似乎崩潰或僅縮小圖像。
這是我的代碼:
rotateClockWise.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
Bitmap bitmap = imageViewtoBitmap(imageView);
int width = bitmap.getWidth();
Log.i(TAG, Integer.toString(width));
int height = bitmap.getHeight();
Log.i(TAG, Integer.toString(height));
Matrix matrix = new Matrix();
matrix.postRotate(90);
Bitmap rotatedBitmap = Bitmap.createBitmap(bitmap, 0, 0,
width, height, matrix, true );
imageView.setImageBitmap(rotatedBitmap);
}
});
rotateCCW.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
Bitmap bitmap = imageViewtoBitmap(imageView);
int width = bitmap.getWidth();
Log.i(TAG, Integer.toString(width));
int height = bitmap.getHeight();
Log.i(TAG, Integer.toString(height));
Matrix matrix = new Matrix();
matrix.postRotate(-90);
Bitmap rotatedBitmap = Bitmap.createBitmap(bitmap, 0, 0,
bitmap.getWidth(), bitmap.getHeight(), matrix, true );
imageView.setImageBitmap(rotatedBitmap);
}
});
public static Bitmap imageViewtoBitmap(ImageView imageView){
/**
* Args:
* imageview: an imageview
* Returns:
* the bitmap of the imageview
*/
//convert imageview to bitmap
imageView.setDrawingCacheEnabled(true);
// Without it the view will have a dimension of 0,0 and the bitmap will
be null
imageView.measure(View.MeasureSpec.makeMeasureSpec(0,
View.MeasureSpec.UNSPECIFIED),
View.MeasureSpec.makeMeasureSpec(0,
View.MeasureSpec.UNSPECIFIED));
// hardcoded so i always know how big image is
imageView.layout(0, 0, imageView.getMeasuredWidth(),
imageView.getMeasuredHeight());
if (imageView == null){
Log.i(TAG, "nothing");
}
imageView.buildDrawingCache(true);
Bitmap bitmapImage = Bitmap.createBitmap(imageView.getDrawingCache());
imageView.setDrawingCacheEnabled(false); // clear drawing cache
return bitmapImage;
}
您應該延遲點擊。
例
在onCreate()中
rotateClockWise.setOnClickListener(this);
rotateCCW.setOnClickListener(this);
在方法onClick
private long lastClick = 1;
void onClick(View view) {
if(SystemClock.elapsedRealtime() - lastClick < 500) return;
lastClick = SystemClock.elapsedRealtime();
switch (view.getId()) {
case R.id.rotateClockWise: // change id of rotateClockWise
break;
case R.id.rotateCCW: // change id of rotateCCW
break;
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.