2017-08-07 95 views
0

在我的應用程序中,我有它,因此button每次按下時都會旋轉bitmap 90度。我有另一個button,做同樣的事情,但旋轉了bitmap -90度。經過多次旋轉後旋轉圖像會導致java.lang.NullPointerException

我的問題是,當我按下旋轉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; 


} 
+0

你能張貼整個異常堆棧 – Swati

回答

0

你應該推遲點擊。

中的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; 
    } 
} 
+0

如果我遲疑,每一次點擊,它甚至沒有工作。 – tokenturtle

+0

你可以發佈方法imageViewtoBitmap? –

+0

已添加代碼。 – tokenturtle