android自定义适配屏幕的ImageView

时间:2022-02-05 16:36:01
  1. package org.angryfun.view;  
  2. <pre name="code" class="java">import android.content.Context;  
  3. import android.graphics.Bitmap;  
  4. import android.util.AttributeSet;  
  5. import android.view.ViewGroup.LayoutParams;  
  6. import android.widget.ImageView;  
  7.   
  8. public class FitImageView extends ImageView {  
  9.     private Bitmap mBitmap;  
  10.     private int mBitmapWidth;  
  11.     private int mBitmapHeight;  
  12.   
  13.     private boolean mReady;  
  14.     private boolean mSetupPending;  
  15.   
  16.     public FitImageView(Context context) {  
  17.         super(context);  
  18.         init();  
  19.     }  
  20.   
  21.     public FitImageView(Context context, AttributeSet attrs) {  
  22.         this(context, attrs, 0);  
  23.     }  
  24.   
  25.     public FitImageView(Context context, AttributeSet attrs, int defStyle) {  
  26.         super(context, attrs, defStyle);  
  27.         init();  
  28.     }  
  29.   
  30.     private void init() {  
  31.         mReady = true;  
  32.   
  33.         if (mSetupPending) {  
  34.             setup();  
  35.             mSetupPending = false;  
  36.         }  
  37.     }  
  38.   
  39.     private void reSize() {  
  40.         int width = getResources().getDisplayMetrics().widthPixels;  
  41.         int height = (int) (getResources().getDisplayMetrics().heightPixels * 0.8);  
  42.         int imgH = mBitmapHeight;  
  43.         int imgW = mBitmapWidth;  
  44.         int lastH = imgH;  
  45.         int lastW = imgW;  
  46.         double radio = 1.0;  
  47.         radio = (width * 1.0) / imgW;  
  48.         if (imgH * radio > height) {  
  49.             radio = (height * 1.0) / imgH;  
  50.         }  
  51.         lastH = (int) (radio * imgH);  
  52.         lastW = (int) (radio * imgW);  
  53.         LayoutParams lp = this.getLayoutParams();  
  54.         lp.width = lastW;  
  55.         lp.height = lastH;  
  56.         this.setLayoutParams(lp);  
  57.     }  
  58.   
  59.     @Override  
  60.     public void setImageBitmap(Bitmap bm) {  
  61.         super.setImageBitmap(bm);  
  62.         mBitmap = bm;  
  63.         setup();  
  64.         reSize();  
  65.     }  
  66.   
  67.     private void setup() {  
  68.         if (!mReady) {  
  69.             mSetupPending = true;  
  70.             return;  
  71.         }  
  72.   
  73.         if (mBitmap == null) {  
  74.             return;  
  75.         }  
  76.   
  77.         mBitmapHeight = mBitmap.getHeight();  
  78.         mBitmapWidth = mBitmap.getWidth();  
  79.   
  80.         invalidate();  
  81.     }  
  82.   
  83. }  





从网络上下载后的图片加载在页面上按照ImageView自带的属性根本就设置不准确,所以自己重新封装了一个ImageView来实现屏幕自适配,其实原理就是重载 setImageBitmap 函数,获得bitmap的宽度和高度然后根据手机屏幕大小自动调整ImageView控件的大小

  <org.angryfun.view.FitImageView
            Android:id="@+id/img_art_real"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"

            android:contentDescription="@null"
            android:scaleType="fitXY"
            android:layout_centerHorizontal="true" />