Android Studio 之 ImageView 学习笔记

 

•参考资料

  [1]:菜鸟教程

  [2]:bilibili视频教程

•src和blackground的区别

  • background通常指的都是背景,而src指的是内容
  • 当使用 src 填入图片时,是按照图片大小直接填充,并不会进行拉伸

  • 而使用 background 填入图片,则是会根据 ImageView 给定的宽度来进行拉伸

•scaleType设置缩放类型

  • fitXY:对图像的长和宽进行独立缩放,使得该图片完全填充 ImageView,但是图片的长宽比可能会发生改变
  • fitStart:保持长宽比缩放图片,直到某一边与Image的某一边等长,缩放完成后将图片放在ImageView的左上角

  • fitCenter:同上,缩放后放于中间

  • fitEnd:同上,缩放后放于右下角

  • center:保持原图的大小,显示在ImageView的中心,当原图的 size 大于 ImageView 的 size,超过部分裁剪处理

  • centerCrop:保持长宽比缩放图片,直到完全覆盖 ImageView,可能会出现图片的显示不完全

  • centerInside:保持长宽比缩放图片,直到ImageView能够完全地显示图片

  • matrix:默认值,不改变原图的大小,从ImageView的左上角开始绘制原图, 原图超过ImageView的部分作裁剪处理

•绘制圆形的ImageView

  参考资料:Android中快速自定义圆形ImageView图形!

  首先,新建一个 java class 并继承 AppCompatImageView 类;

  在该类中放入如下代码:

Android Studio 之 ImageView 学习笔记
 1 import android.content.Context;
 2 import android.graphics.Bitmap;
 3 import android.graphics.BitmapShader;
 4 import android.graphics.Canvas;
 5 import android.graphics.Color;
 6 import android.graphics.Matrix;
 7 import android.graphics.Paint;
 8 import android.graphics.Rect;
 9 import android.graphics.Shader;
10 import android.graphics.drawable.BitmapDrawable;
11 import android.graphics.drawable.ColorDrawable;
12 import android.graphics.drawable.Drawable;
13 import android.util.AttributeSet;
14 
15 import androidx.appcompat.widget.AppCompatImageView;
16 
17 public class ImageViewPlus extends AppCompatImageView {
18 
19     private Paint mPaintBitmap = new Paint(Paint.ANTI_ALIAS_FLAG);
20     private Bitmap mRawBitmap;
21     private BitmapShader mShader;
22     private Matrix mMatrix = new Matrix();
23 
24     public ImageViewPlus(Context context, AttributeSet attrs) {
25         super(context, attrs);
26     }
27 
28     @Override
29     protected void onDraw(Canvas canvas) {
30         Bitmap rawBitmap = getBitmap(getDrawable());
31         if (rawBitmap != null){
32             int viewWidth = getWidth();
33             int viewHeight = getHeight();
34             int viewMinSize = Math.min(viewWidth, viewHeight);
35             float dstWidth = viewMinSize;
36             float dstHeight = viewMinSize;
37             if (mShader == null || !rawBitmap.equals(mRawBitmap)){
38                 mRawBitmap = rawBitmap;
39                 mShader = new BitmapShader(mRawBitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
40             }
41             if (mShader != null){
42                 mMatrix.setScale(dstWidth / rawBitmap.getWidth(), dstHeight / rawBitmap.getHeight());
43                 mShader.setLocalMatrix(mMatrix);
44             }
45             mPaintBitmap.setShader(mShader);
46             float radius = viewMinSize / 2.0f;
47             canvas.drawCircle(radius, radius, radius, mPaintBitmap);
48         }
49         else {
50             super.onDraw(canvas);
51         }
52     }
53 
54     private Bitmap getBitmap(Drawable drawable){
55         if (drawable instanceof BitmapDrawable){
56             return ((BitmapDrawable)drawable).getBitmap();
57         }
58         else if (drawable instanceof ColorDrawable){
59             Rect rect = drawable.getBounds();
60             int width = rect.right - rect.left;
61             int height = rect.bottom - rect.top;
62             int color = ((ColorDrawable)drawable).getColor();
63             Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
64             Canvas canvas = new Canvas(bitmap);
65             canvas.drawARGB(Color.alpha(color), Color.red(color), Color.green(color), Color.blue(color));
66             return bitmap;
67         }
68         else {
69             return null;
70         }
71     }
72 }
ImageViewPlus.java

  然后,在你需要设置圆形 ImageView 空间的 .xml 代码中,将 <ImageView> 控件改成

    <com.example.table.ImageViewPlus>;

  其他的操作和 <ImageView> 操作一致,显示出来的图片就是圆形图片。

上一篇:android-图片拉伸


下一篇:android从URL显示图像时出现错误