Activity runs slow with a couple of ImageView-s

前端 未结 4 1337
猫巷女王i
猫巷女王i 2020-12-16 23:57

I have an activity containing 4 images in total. They are all matching the resolution of a 1080x1920 device. When I run the activity with those images, which are loaded dire

相关标签:
4条回答
  • 2020-12-17 00:40

    Try facebook's fresco library. It can handle large images and one of my projects, reduces memory consumption about 50%.

    0 讨论(0)
  • 2020-12-17 00:51

    Problem is resolution of the image, if you can reduce resolution of the image then work fine, here is some example for reducing image resolution and size.

    If you pass bitmap width and height then use below function.

        public Bitmap getResizedBitmap(Bitmap image, int bitmapWidth,
                int bitmapHeight) {
            return Bitmap.createScaledBitmap(image, bitmapWidth, bitmapHeight,
                    true);
        } 
    

    if you want bitmap ratio same and reduce bitmap size. then pass your maximum size bitmap. you can use this function

    public Bitmap getResizedBitmap(Bitmap image, int maxSize) {
        int width = image.getWidth();
        int height = image.getHeight();
    
        float bitmapRatio = (float)width / (float) height;
        if (bitmapRatio > 0) {
            width = maxSize;
            height = (int) (width / bitmapRatio);
        } else {
            height = maxSize;
            width = (int) (height * bitmapRatio);
        }
        return Bitmap.createScaledBitmap(image, width, height, true);
    }
    

    or if you are using drawable resources then use this method

    public Drawable resizeImage(int imageResource) {// R.drawable.large_image
        // Get device dimensions
        Display display = getWindowManager().getDefaultDisplay();
        double deviceWidth = display.getWidth();
    
        BitmapDrawable bd = (BitmapDrawable) this.getResources().getDrawable(
                imageResource);
        double imageHeight = bd.getBitmap().getHeight();
        double imageWidth = bd.getBitmap().getWidth();
    
        double ratio = deviceWidth / imageWidth;
        int newImageHeight = (int) (imageHeight * ratio);
    
        Bitmap bMap = BitmapFactory.decodeResource(getResources(), imageResource);
        Drawable drawable = new BitmapDrawable(this.getResources(),
                getResizedBitmap(bMap, newImageHeight, (int) deviceWidth));
    
        return drawable;
    }
    
    /************************ Resize Bitmap *********************************/
    public Bitmap getResizedBitmap(Bitmap bm, int newHeight, int newWidth) {
    
        int width = bm.getWidth();
        int height = bm.getHeight();
    
        float scaleWidth = ((float) newWidth) / width;
        float scaleHeight = ((float) newHeight) / height;
    
        // create a matrix for the manipulation
        Matrix matrix = new Matrix();
    
        // resize the bit map
        matrix.postScale(scaleWidth, scaleHeight);
    
        // recreate the new Bitmap
        Bitmap resizedBitmap = Bitmap.createBitmap(bm, 0, 0, width, height,
                matrix, false);
    
        return resizedBitmap;
    }
    
    0 讨论(0)
  • 2020-12-17 01:01

    Actually this should not be an issue and these images are not so big to make you phone laggy. Take a look on other stuff you have in the application, it is possible there is some heavy operations (like DB writing/readin, API requests) right in UI thread.

    If there is no such operations and you see such problems with the perfomance, try to set these images via some libraries, like Picasso.

    Gradle dependency:

    compile 'com.squareup.picasso:picasso:2.4.0'
    

    And code will look like this:

    Picasso.with(this).load(R.drawable.my_image).into(toolbar);

    0 讨论(0)
  • 2020-12-17 01:03

    TRY

    1. Definitely reduce the size of the images.
    2. Cache images if you can.
    3. Download the images on a different thread. Store a HashMap would make it easy for you

    When you get the list of image urls, iterate through them:

    pictures.put(id,view);
            try{
                FileInputStream in = openFileInput(id);
                Bitmap bitmap = null;
                bitmap = BitmapFactory.decodeStream(in, null, null);
            view.setImageBitmap(bitmap);
            }catch(Exception e){
                new Thread(new PictureGetter(this,mHandler,id)).start();
            }
    

    Code to update the image view:

    if(id!=null){
            ImageView iv = pictures.get(id);
            if(iv!=null){
                try{
                    FileInputStream in = openFileInput(id);
                    Bitmap bitmap = null;
                    bitmap = BitmapFactory.decodeStream(in, null, null);
                    iv.setImageBitmap(bitmap);
                }catch(Exception e){
            }
        }
    
    0 讨论(0)
提交回复
热议问题