zoukankan      html  css  js  c++  java
  • Android之等比例显示图片

      在android中,由于密度的影响,如果想得到图片的宽高是不行的,具体为什么我就大概说一下,具体的请搜索度娘或者古哥吧。 原因是如果你把图片放在drawable-mdpi里,而手机是属于drawable-hdpi的话,图片是被自动放大,就这样取到的宽与高未必就是正确的。那么如何让android上面显示的图片是基于原来图片的比例呢,首先你可以在res目录下创建一个drawable-nodpi的目录,这个目录下的图片是不根据dpi的多少来进行拉伸或者缩小滴。然后,就是根据屏幕的宽 和 图片的宽高 得出图片在屏幕显示的高,宽是固定的,就是屏幕的宽,所以不用算了。

    private void getWidth_Height() {
            Display display = getWindowManager().getDefaultDisplay();
            int width = display.getWidth(); // deprecated
            int height = display.getHeight(); // deprecated
    
            Bitmap mBitmap = createImageWithResouce(R.drawable.history4);
            image.setLayoutParams(new LayoutParams(width, width / getBitmapWidth(mBitmap) * getBitmapHeight(mBitmap)));
            image.setImageBitmap(createImageWithResouce(R.drawable.history4));
        }
    
        private Bitmap createImageWithResouce(int resourceID) {
            Bitmap bit = BitmapFactory.decodeResource(getResources(), R.drawable.history4);
            return bit;
        }
        
        private int getBitmapWidth(Bitmap bitmap){
            return bitmap.getWidth();
        }
        private int getBitmapHeight(Bitmap bitmap){
            return bitmap.getHeight();
        }
        
        // 释放bitmap
        private void releaseBitmap(Bitmap bitmap){
            if (bitmap!=null && !bitmap.isRecycled()) {
                bitmap.recycle();
                bitmap = null;
            }
        }

     建议使用如下的这种,应用了LruCache作为管理

    public class ImageUtil {
        private LruCache<String, Bitmap> mMemoryCache;
        private final Context mContext;
    
        private static ImageUtil imageUtil;
    
        private static Object obj = new Object();
    
        private int memClass;
    
        private int cacheSize;
    
        private ImageUtil(Context mContext) {
            this.mContext = mContext;
            createLruCache(mContext);
        }
    
        private void createLruCache(Context mContext) {
            memClass = ((ActivityManager) mContext.getSystemService(Context.ACTIVITY_SERVICE)).getMemoryClass();
            cacheSize = 1024 * 1024 * memClass / 8;
            mMemoryCache = new LruCache<String, Bitmap>(cacheSize) {
                @Override
                protected int sizeOf(String key, Bitmap value) {
                    // TODO Auto-generated method stub
                    return value.getRowBytes();
                }
    
            };
        }
    
        public static ImageUtil getInstance(Context mContext) {
            if (imageUtil == null) {
                synchronized (obj) {
                    if (imageUtil == null) {
                        imageUtil = new ImageUtil(mContext);
                    }
                }
            }
            return imageUtil;
        }
    
        public void adjustImageSize(ImageView imageView, int imageResourceId) {
            Bitmap mBitmap = null;
            Display display = ((MainActivity) mContext).getWindowManager().getDefaultDisplay();
            int width = display.getWidth(); // deprecated
            int height = display.getHeight(); // deprecated
    
            Bitmap bitmapCache = mMemoryCache.get(imageResourceId + "");
            if (bitmapCache != null) {
                mBitmap = bitmapCache;
            } else {
                mBitmap = createImageWithResouce(mContext, imageResourceId);
                mMemoryCache.put(imageResourceId + "", mBitmap);
            }
    
            RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(width, width
                    / getBitmapWidth(mBitmap) * getBitmapHeight(mBitmap));
            layoutParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);
    
            imageView.setLayoutParams(layoutParams);
    
            imageView.setBackgroundDrawable(new BitmapDrawable(mBitmap));
            // imageView.setImageBitmap(mBitmap);
        }
    
        private static Bitmap createImageWithResouce(Context context, int resourceID) {
            Bitmap bit = BitmapFactory.decodeResource(context.getResources(), R.drawable.ic_launcher);
            return bit;
        }
    
        private int getBitmapWidth(Bitmap bitmap) {
            return bitmap.getWidth();
        }
    
        private int getBitmapHeight(Bitmap bitmap) {
            return bitmap.getHeight();
        }
    }
  • 相关阅读:
    SCAU 9504 面试
    SCAU 9503 懒人选座位
    SCAU 8628 相亲
    SCAU 10691 ACM 光环
    SCAU 8626 原子量计数
    SCAU 10674 等差对
    HDU ACM 1048 The Hardest Problem Ever (水题)
    SCAU 9502 ARDF
    SCAU 10686 DeathGod不知道的事情
    SCAU 8629 热身游戏(高精度)
  • 原文地址:https://www.cnblogs.com/lee0oo0/p/3340752.html
Copyright © 2011-2022 走看看