简体   繁体   中英

How to get ImageView Height and Width every time, before it is drawn to the UI (in a Fragment)

I want to set a Photo from the external Storage into a (Circular)ImageView. Therefore I have a function, that asks for the ImageView Hight and Width, to crop the Picture and then sets it as Bitmap.

My Problem is, that this function gets called before the UI is loaded. I came across with the solution, that I call this function the first time, in onViewCreated, where I add a Listener to addOnWindowFocusChangeListener. This works for the first time.

The fragment is inside a ViewPager and if I go to the fragment on the left and then over the middle to the right, it is again gone.

I am completely new to StackOverflow. I appreciate every Tip, what I can do better.

//This works for the First Time

    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);

        View m = getView();
        ViewTreeObserver n = m.getViewTreeObserver();
        n.addOnWindowFocusChangeListener(new ViewTreeObserver.OnWindowFocusChangeListener() {
            @Override
            public void onWindowFocusChanged(final boolean hasFocus) {
                // do your stuff here
                ImageUtil.setPic(binding.photoRoundProfile, mCurrentPhotoPath);

            }
        });
    }
//The function where I set the Picture into the ImageView

static public void setPic(ImageView mImageView, String pPath) {
        try {
            if (pPath == null) return;
            File f = new File(pPath);
            if (!f.exists() || f.isDirectory()) return;

            // Get the dimensions of the View
            int targetW = mImageView.getWidth();
            if (targetW == 0) targetW = mImageView.getMeasuredWidth();
            int targetH = mImageView.getHeight();
            if (targetH == 0) targetH = mImageView.getMeasuredHeight();

            // Get the dimensions of the bitmap
            BitmapFactory.Options bmOptions = new BitmapFactory.Options();
            bmOptions.inJustDecodeBounds = true;
            BitmapFactory.decodeFile(pPath, bmOptions);
            int photoW = bmOptions.outWidth;
            int photoH = bmOptions.outHeight;

            // Determine how much to scale down the image
            int scaleFactor = photoW / targetW; //Math.min(photoW/targetW, photoH/targetH);

            // Decode the image file into a Bitmap sized to fill the View
            bmOptions.inJustDecodeBounds = false;
            bmOptions.inSampleSize = scaleFactor;
            bmOptions.inPurgeable = true;

            Bitmap bitmap = BitmapFactory.decodeFile(pPath, bmOptions);
            Bitmap orientedBitmap = ExifUtil.rotateBitmap(pPath, bitmap);
            mImageView.setImageBitmap(orientedBitmap);

            //mImageView.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT));
            mImageView.setAdjustViewBounds(true);
            mImageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

There is a video, for better understanding: https://www.loom.com/share/05c4174562d74c9bba8ff02c9072c866

I found a solution to my problem. I have found the Method onPreDraw in OnPreDrawListener . This Listener runs every time the ImageView is updated. Therefore I added an if-Statement to save performance and not redrawing every time.

@Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);

        ImageView iv= binding.photoRoundProfile;
        ViewTreeObserver vto = iv.getViewTreeObserver();
        vto.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {

            private int mFinalWidth = 0;
            private int mFinalHeight = 0;

            public boolean onPreDraw() {

                if(mFinalHeight != 0 || mFinalWidth != 0)
                    return true;

                mFinalHeight = iv.getHeight();
                mFinalWidth = iv.getWidth();
                Log.d("hilength","Height: " + mFinalHeight + " Width: " + mFinalWidth);

                ImageUtil.setPic(binding.photoRoundProfile, mCurrentPhotoPath);
                return true;
            }
        });
    }

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM