簡體   English   中英

經過多次旋轉后,旋轉圖像會導致java.lang.NullPointerException

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM