Android 基础知识4-3.4 ImageView(图像视图)详解

news2024/11/27 18:35:11

一、ImageView简介

        ImageView是Android开发中最常用的组件之一,主要用于显示图片,但是它不只是能显示图片,任何Drawable对象都可以使用它来显示。

二、ImageView 的继承关系

ImageView的继承关系 如下:

java.lang.Object 《-- android.view.View 《--android.widget.ImageView

三、ImageView基本使用

        下面实现在布局文件中添加一个ImageView,用来展示图片,仅仅设置了ImageView的宽高、背景色、图片的src等基本属性。此处设置背景色是由于有时候图片并不能完整的填充整个ImageView,添加背景色方便查看显示效果。

<ImageView
    android:id="@+id/imageView"
    android:layout_width="250dp"
    android:layout_height="200dp"
    android:background="#ff0000"
    android:src="@drawable/winter"/>

四、ImageView常用属性

android:maxWidth:ImageView的最大宽度。
android:maxHeight:ImageView的最大高度。
android:adjustViewBounds:用于调整ImageView的边界,使得ImageView和图片有一样的长宽比例,通常配合maxWidth、maxHeight一起使用。
android:src:设置要显示的Drawable对象的引用。
android:scaleType:设置图片的缩放类型,后面详细介绍

五、ImageView几种图片的加载方法

5.1、在布局文件中设置属性app:srcCompat加载本地图片。
5.2、setImageResource(int resId):加载drawable文件夹中的资源文件。
5.3、setImageURI(Uri):加载手机中的图片文件。
5.4、setImageBitmap(Bitmap):加载Bitmap。
5.5、setImageDrawable(Drawable):加载 Drawable。

六、ImageView 背景 间距属性设置

在xml使用ImageView控件:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <ImageView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@android:color/darker_gray"
        android:padding="5dp"
        android:src="@mipmap/liwu" />

</LinearLayout>

效果图如下:

六、使用Bitmap 类型动态设置ImageView 资源

在xml 使用ImageView控件

android:id="@+id/img_1"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:padding="5dp" />

2.java 类实现

// 1.从资源中获取Bitmap

ImageView mImageView1 = (ImageView) findViewById(R.id.img_1);

DrawableUtils.UseBitmap(this, mImageView1, R.drawable.gril);

3.DrawableUtils类方法实现

// 1.从资源中获取Bitmap

public static void UseBitmap(Context context, ImageView imageView, int drawableId) {

Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(),

drawableId);

imageView.setImageBitmap(bitmap);

}

效果图如下:

 七、ImageView的缩放类型

ImageView的android:scaleType属性用于设置图片的缩放类型,共有如下8种缩放类型:

7.1、android:scaleType="centerInside":图片按比例缩小或保持原来尺寸,显示在ImageView中央。

7.2、android:scaleType="fitStart":图片按比例放大或缩小到ImageView的宽度或高度,显示在ImageView的左上角,图片会完整显示。

7.3、android:scaleType="fitEnd":图片按比例放大或缩小到ImageView的宽度或高度,显示在ImageView的右下角,图片会完整显示。

7.4、android:scaleType="center":按照图片的原始大小显示在ImageView的中央,若图片尺寸大于ImageView宽高,则只显示部分,图片不会进行缩放。

7.5、android:scaleType="matrix":经过matrix变换的图片显示在ImageView的左上角,若缩放后的图片尺寸大于ImageView宽高,则只显示部分。该模式需要与ImageView.setImageMatrix(Matrix matrix)配合使用,因为该模式需要用于指定一个变换矩阵用于指定图片如何展示,其实其他的7种模式都是通过ImageView在内部生成了相应的变换矩阵。

7.6、android:scaleType="fitXY":将图片拉伸至填充整个ImageView,不按比例缩放。

7.7、android:scaleType="fitCenter":默认使用这种模式。按比例放大或缩小图片至ImageView的宽高,然后居中显示。

7.8、android:scaleType="centerCrop":图片等比例缩放至完全填充整个ImageView,居中显示,并将放大后的多余部分裁剪掉。

 八、ImageView 图片倒影实现

在xml使用ImageView 控件

android:id="@+id/img_4"

android:layout_width="match_parent"

android:layout_height="200dp"

android:background="@color/grey"

android:padding="5dp" />

java代码 实现效果

// 4.倒影图片

ImageView mImageView4 = (ImageView) findViewById(R.id.img_4);

mImageView4.setImageBitmap(DrawableUtils.CreateReflectionImageWithOrigin(

DrawableUtils.DrawableToBitmap(getResources().getDrawable(

R.drawable.img1))));

DrawableUtils 工具类的方法实现

// 5. Drawable----> Bitmap

public static Bitmap DrawableToBitmap(Drawable drawable) {

// 获取 drawable 长宽

int width = drawable.getIntrinsicWidth();

int heigh = drawable.getIntrinsicHeight();

drawable.setBounds(0, 0, width, heigh);

// 获取drawable的颜色格式

Bitmap.Config config = drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888

: Bitmap.Config.RGB_565;

// 创建bitmap

Bitmap bitmap = Bitmap.createBitmap(width, heigh, config);

// 创建bitmap画布

Canvas canvas = new Canvas(bitmap);

// 将drawable 内容画到画布中

drawable.draw(canvas);

return bitmap;

}

实现效果如下:

 九、ImageView 圆角图片 实现

8.1、在xml使用ImageView 控件

android:id="@+id/img_3"

android:layout_width="match_parent"

android:layout_height="150dp"

android:background="@color/grey"

android:padding="5dp" />

8.2、.java代码 实现效果

// 3. 圆角图片

ImageView mImageView3 = (ImageView) findViewById(R.id.img_3);

mImageView3.setImageBitmap(DrawableUtils.SetRoundCornerBitmap(

DrawableUtils.DrawableToBitmap(getResources().getDrawable(

R.drawable.img1)), 60));

DrawableUtils工具类方法实现

// 6.圆角图片

public static Bitmap SetRoundCornerBitmap(Bitmap bitmap, float roundPx) {

int width = bitmap.getWidth();

int heigh = bitmap.getHeight();

// 创建输出bitmap对象

Bitmap outmap = Bitmap.createBitmap(width, heigh,

Bitmap.Config.ARGB_8888);

Canvas canvas = new Canvas(outmap);

final int color = 0xff424242;

final Paint paint = new Paint();

final Rect rect = new Rect(0, 0, width, heigh);

final RectF rectf = new RectF(rect);

paint.setAntiAlias(true);

canvas.drawARGB(0, 0, 0, 0);

paint.setColor(color);

canvas.drawRoundRect(rectf, roundPx, roundPx, paint);

paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));

canvas.drawBitmap(bitmap, rect, rect, paint);

return outmap;

}

实现效果如下:

 十、Bitmap与Drawable 转换工具类

Bitmap与Drawable 转换常用工具类源代码如下:

package com.chinasoftnc.helloword;

import java.io.ByteArrayOutputStream;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.LinearGradient;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.PixelFormat;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffXfermode;
import android.graphics.Rect;
import android.graphics.RectF;
import android.graphics.Shader;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.widget.ImageView;

public class DrawableUtils {
    /**
     * 1.从资源中获取Bitmap
     */
    public static void UseBitmap(Context context, ImageView imageView, int drawableId) {
        Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(), drawableId);
        imageView.setImageBitmap(bitmap);
    }

    /**
     * 2.Bitmap ---> byte[]
     */
    public byte[] BitmapToBytes(Bitmap bitmap) {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        bitmap.compress(Bitmap.CompressFormat.PNG, 100, baos);
        return baos.toByteArray();
    }

    /**
     * 3.byte[] ---->bitmap
     */
    public Bitmap BytesToBitmap(byte[] b) {
        if (b.length != 0) {
            return BitmapFactory.decodeByteArray(b, 0, b.length);
        } else {
            return null;
        }
    }

    /**
     * 4.Bitmap 缩放方法
     */
    public static Bitmap ZoomBitmap(Bitmap bitmap, int width, int heigh) {
        int w = bitmap.getWidth();
        int h = bitmap.getHeight();
        Matrix matrix = new Matrix();
        float scalewidth = (float) width / w;
        float scaleheigh = (float) heigh / h;
        matrix.postScale(scalewidth, scaleheigh);
        Bitmap newBmp = Bitmap.createBitmap(bitmap, 0, 0, w, h, matrix, true);
        return newBmp;
    }

    /**
     * 5. Drawable----> Bitmap
     */
    public static Bitmap DrawableToBitmap(Drawable drawable) {
        // 获取 drawable 长宽
        int width = drawable.getIntrinsicWidth();
        int heigh = drawable.getIntrinsicHeight();
        drawable.setBounds(0, 0, width, heigh);

        // 获取drawable的颜色格式
        Bitmap.Config config = drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888 : Bitmap.Config.RGB_565;

        // 创建bitmap
        Bitmap bitmap = Bitmap.createBitmap(width, heigh, config);

        // 创建bitmap画布
        Canvas canvas = new Canvas(bitmap);

        // 将drawable 内容画到画布中
        drawable.draw(canvas);
        return bitmap;
    }

    /**
     * 6.圆角图片
     */
    public static Bitmap SetRoundCornerBitmap(Bitmap bitmap, float roundPx) {
        int width = bitmap.getWidth();
        int heigh = bitmap.getHeight();

        // 创建输出bitmap对象
        Bitmap outmap = Bitmap.createBitmap(width, heigh, Bitmap.Config.ARGB_8888);
        Canvas canvas = new Canvas(outmap);
        final int color = 0xff424242;
        final Paint paint = new Paint();
        final Rect rect = new Rect(0, 0, width, heigh);
        final RectF rectf = new RectF(rect);
        paint.setAntiAlias(true);
        canvas.drawARGB(0, 0, 0, 0);
        paint.setColor(color);
        canvas.drawRoundRect(rectf, roundPx, roundPx, paint);
        paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
        canvas.drawBitmap(bitmap, rect, rect, paint);
        return outmap;
    }

    /**
     * 7.获取带倒影的图片
     */
    public static Bitmap CreateReflectionImageWithOrigin(Bitmap bitmap) {
        final int reflectionGapLine = 4;
        int w = bitmap.getWidth();
        int h = bitmap.getHeight();
        Matrix matrix = new Matrix();
        matrix.preScale(1, -1);
        Bitmap reflectionImage = Bitmap.createBitmap(bitmap, 0, h / 2, w, h / 2, matrix, false);
        Bitmap bitmapWithReflection = Bitmap.createBitmap(w, (h + h / 2), Bitmap.Config.ARGB_8888);
        Canvas canvas = new Canvas(bitmapWithReflection);
        canvas.drawBitmap(bitmap, 0, 0, null);
        Paint deafalutPaint = new Paint();
        canvas.drawRect(0, h, w, h + reflectionGapLine, deafalutPaint);
        canvas.drawBitmap(reflectionImage, 0, h + reflectionGapLine, null);
        Paint paint = new Paint();
        LinearGradient shader = new LinearGradient(0, bitmap.getHeight(), 0,
                bitmapWithReflection.getHeight() + reflectionGapLine, 0x70ffffff,
                0x00ffffff, Shader.TileMode.CLAMP);
        paint.setShader(shader);
        paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN));
        canvas.drawRect(0, h, w, bitmapWithReflection.getHeight() + reflectionGapLine, paint);
        return bitmapWithReflection;
    }

    /**
     * 8. bitmap ---Drawable
     */
    public static Drawable BitmapToDrawable(Bitmap bitmap, Context context) {
        BitmapDrawable drawbale = new BitmapDrawable(context.getResources(), bitmap);
        return drawbale;
    }

    /**
     * drawable进行缩放 ---> bitmap 然后比对bitmap进行缩放
     */
    public static Drawable ZoomDrawable(Drawable drawable, int w, int h) {
        int width = drawable.getIntrinsicWidth();
        int height = drawable.getIntrinsicHeight();

        // 调用5 中 drawable转换成bitmap
        Bitmap oldbmp = DrawableToBitmap(drawable);

        // 创建操作图片用的Matrix对象
        Matrix matrix = new Matrix();

        // 计算缩放比例
        float sx = ((float) w / width);
        float sy = ((float) h / height);

        // 设置缩放比例
        matrix.postScale(sx, sy);

        // 建立新的bitmap,其内容是对原bitmap的缩放后的图
        Bitmap newbmp = Bitmap.createBitmap(oldbmp, 0, 0, width, height, matrix, true);
        return new BitmapDrawable(newbmp);
    }
}

本节小结:

本节讲解了ImageView(图像视图),内容看上很多,不过都是一些详述性的东西,知道即可。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/372855.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

生成式语言大模型压缩技术思考——以ChatGPT为例

ChatGPT引领了生成式语言大模型的应用与技术热潮&#xff0c;首先简单回顾ChatGPT应用范式&#xff1a;将其应用于指定的下游任务时&#xff08;如知识问答、翻译、编码&#xff09;&#xff0c;ChatGPT需要经历三个阶段的训练&#xff08;增强人类语境的猜想&#xff09;&…

基于nodejs+vue的平面设计课程管理系统vscode

后台由管理员&#xff0c;教师和学生三个角色&#xff0c;其主要功能包括首页&#xff0c;个人中心&#xff0c;学生管理&#xff0c;教师管理&#xff0c;课程类型管理&#xff0c;课程学习管理&#xff0c;试题讲解管理&#xff0c;作业信息管理&#xff0c;作业提交管理&…

Flutter3引用原生播放器-IOS(Swift)篇

前言由于Flutter项目中需要使用到播放器功能&#xff0c;因此对flutter中各种播放器解决方案进行了一番研究和比对&#xff0c;最后决定还是自己通过Plugin的方法去引用原生播放器符合自己的需求&#xff0c;本篇文章会对各种解决方案做一个简单的比较&#xff0c;以及讲解一下…

STM32—DMA

什么是DMA&#xff1f; DMA(Direct Memory Access&#xff0c;直接存储器访问) 提供在外设与内存、存储器和存储器、外设与外设之间的高速数据传输使用。它允许不同速度的硬件装置来沟通&#xff0c;而不需要依赖于CPU&#xff0c;在这个时间中&#xff0c;CPU对于内存的工作来…

Leetcode 剑指 Offer II 016. 不含重复字符的最长子字符串

题目难度: 中等 原题链接 今天继续更新 Leetcode 的剑指 Offer&#xff08;专项突击版&#xff09;系列, 大家在公众号 算法精选 里回复 剑指offer2 就能看到该系列当前连载的所有文章了, 记得关注哦~ 题目描述 给定一个字符串 s &#xff0c;请你找出其中不含有重复字符的最长…

软考之操作系统知识

目录 1.进程管理-进程的概念 2.进程的三态图和五态图 3.进程的同步与互斥 4.PV操作应用 5.死锁问题 6.银行家算法 7.存储管理 8.段式存储组织 9.段页式存储组织 10.页面置换算法 11.磁盘管理 12.作业管理 13.索引文件结构 14.树型目录结构 15.空闲存储空间管理 …

第四届蓝桥杯省赛 C++ B组 - 翻硬币

✍个人博客&#xff1a;https://blog.csdn.net/Newin2020?spm1011.2415.3001.5343 &#x1f4da;专栏地址&#xff1a;蓝桥杯题解集合 &#x1f4dd;原题地址&#xff1a;翻硬币 &#x1f4e3;专栏定位&#xff1a;为想参加蓝桥杯的小伙伴整理常考算法题解&#xff0c;祝大家都…

人工智能学习07--pytorch09--LeNet

参考&#xff1a; 视频&#xff1a; https://www.bilibili.com/video/BV187411T7Ye/?spm_id_from333.999.0.0&vd_sourceb425cf6a88c74ab02b3939ca66be1c0d 博客&#xff1a;https://blog.csdn.net/STATEABC/article/details/123661612?utm_mediumdistribute.pc_feed_404.…

如何使用goquery进行HTML解析以及它的源码分析和实现原理

目录 goquery 是什么 goquery 能用来干什么 goquery quick start 玩转goquery.Find() 查找多个标签 Id 选择器 Class 选择器 属性选择器 子节点选择器 内容过滤器 goquery 源码分析 图解源码 总结 goquery 简介 goquery是一款基于Go语言的HTML解析库&#xff0c;…

聚类算法(上):8个常见的无监督聚类方法介绍和比较

无监督聚类方法的评价指标必须依赖于数据和聚类结果的内在属性&#xff0c;例如聚类的紧凑性和分离性&#xff0c;与外部知识的一致性&#xff0c;以及同一算法不同运行结果的稳定性。 本文将全面概述Scikit-Learn库中用于的聚类技术以及各种评估方法。 本文将分为2个部分&…

【Mac 教程系列】如何在 Mac 中用终端命令行方式打开 Sublime Text ?

如何在 Mac 中用终端命令行方式打开 Sublime Text ? 用 markdown 格式输出答案。 不少于1000字。细分到2级目录。 如何在 Mac 中用终端命令行方式打开 Sublime Text ? 一、首先确保已经安装 Sublime Text 前往官网https://www.sublimetext.com/下载 Sublime Text&#xff0c…

Bootstrap表单的使用

文章目录前言一、创建基础表单垂直表单&#xff08;默认&#xff09;内联表单&#xff08;水平显示&#xff09;表单控制尺寸大小给表单控件添加帮助文本禁用/只读表单无边框的控件取色器选择菜单&#xff08;默认宽度100%&#xff09;调整下拉菜单的大小表单开关滑块表单组多个…

LabVIEW网络服务安全

LabVIEW网络服务安全如何保护Web服务&#xff1f;当许多人考虑安全性时&#xff0c;他们会考虑加密、用户ID和密码。用户ID和密码用于授权&#xff08;告诉目标谁在发出请求&#xff09;。加密保护客户端和服务器之间的通信流量&#xff0c;以便未经授权的个人无法拦截和读取发…

【架构师】零基础到精通——康威定律

博客昵称&#xff1a;架构师Cool 最喜欢的座右铭&#xff1a;一以贯之的努力&#xff0c;不得懈怠的人生。 作者简介&#xff1a;一名Coder&#xff0c;软件设计师/鸿蒙高级工程师认证&#xff0c;在备战高级架构师/系统分析师&#xff0c;欢迎关注小弟&#xff01; 博主小留言…

20_FreeRTOS低功耗模式

目录 低功耗模式简介 STM32低功耗模式 Tickless模式详解 Tickless模式相关配置 实验源码 低功耗模式简介 很多应用场合对于功耗的要求很严格,比如可穿戴低功耗产品、物联网低功耗产品等。 一般MCU都有相应的低功耗模式,裸机开发时可以使用MCU的低功耗模式。 FreeRTOS也…

Linux学习(8.7)命令与文件的搜寻

目录 命令与文件的搜寻 which 文件档名的搜寻&#xff1a; whereis (寻找特定文件) locate find 以下内容转载自鸟哥的Linux私房菜 命令与文件的搜寻 which 这个命令是根据『PATH』这个环境变量所规范的路径&#xff0c;去搜寻『运行档』的档名&#xff5e; 所以&am…

计算机组成原理——运算方法续集(浮点数表示法)

浮点表示法把一个数字的有效数字和数的范围在计算机的一个存储单元中分别予以表示。这种精度分别表示的方法&#xff0c;相当于数的小数点位置随比例因子的不同而在一定范围内可以浮点&#xff0c;所以称为浮点表示法。在计算机中一个任意二进制数N可以写成N 2^e.M其中M称为浮…

Overleaf推广奖励:增加合作者的数量、解锁Dropbox同步和项目修改历史

Overleaf推广奖励 Overleaf是一个LaTeX\LaTeXLATE​X在线编译器&#xff0c;它可以让你与合作者共同在线编辑文档。但是默认的免费账号仅能邀请一个合作者。那么如何增加合作者的数量呢&#xff1f; Overleaf推出了一个奖励计划&#xff0c;你邀请其他人注册Overleaf&#xf…

使用MavenCentral发布Kotlin多平台库的远程依赖(KMM,KMP)

前言 开发者可能都会做自己的开源库,像我以前只做一些单平台的,如Android或JVM平台,这时候直接使用jitpack即可,很简单就能发布远程依赖 jitpack参考: 发布开源库的踩坑经历:jitpack.io_李小白lt的博客 而现在Kotlin可以通过expect来实现原生多平台项目(或库),这时我们开发…

【计算机三级网络技术】 第二篇 中小型系统总体规划与设计

文章目录一、基于网络的信息系统基本结构二、划分网络系统组建工程阶段三、网络需求调研与系统设计原则四、网络用户调查与网络工程需求分析1.网络用户调查2.网络节点的地理位置分布3.应用概要分析4.网络需求详细分析五、网络总体设计基本方法1.网络工程建设总体目标与设计原则…