第六篇Android--ImageView、Bitmap

news2024/11/27 9:54:51

ImageView,和前面介绍的TextView、EditText,都继承自View都是View的子类。

ImageView 是用于呈现图片的视图。View可以理解为一个视图或控件。

1.简单使用

   在drawable-xxhdpi文件夹下放一张图片:

   

  xml中把这张图片设置给ImageView,这样就可以在屏幕上看到这张图:

      <ImageView
        android:id="@+id/image_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/girl" />

  另外也可以在代码中给ImageView设置图片:

     方法1:

 imageView = findViewById(R.id.image_view);
 imageView.setImageResource(R.drawable.girl);

     方法2:

 Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.girl);
 imageView.setImageBitmap(bitmap);

   方法1中通过:setImageResource(@DrawableRes int resId)方式,传入一个资源Id,在该方法内会把资源Id加载成一个Drawable。

       ImageView.java中

          try {
                d = mContext.getDrawable(mResource);
            } catch (Exception e) {
                Log.w(LOG_TAG, "Unable to find resource: " + mResource, e);
                // Don't try again.
                mResource = 0;
            }

   方法2中,先把资源Id解析成一个Bitmap,然后把Bitmap设置给ImageView。

      imageView.setImageBitmap(bitmap); 这个方法中,也会把传进来的bitmap转换成Drawable。

        mDrawable = null;
        if (mRecycleableBitmapDrawable == null) {
            mRecycleableBitmapDrawable = new BitmapDrawable(mContext.getResources(), bm);
        } else {
            mRecycleableBitmapDrawable.setBitmap(bm);
        }
        setImageDrawable(mRecycleableBitmapDrawable);

  以上两种方式都会把生成的Drawable赋值给ImageView的成员变量:Drawable  mDrawable

   设置完成后,都调用了invalidate();

                        这会调用父类View的invalidate(),

                        在View中会调用Parent,也就是ViewRootImpl的invalidate()方法。

                        在ViewRootImpl的invalidate()方法中,会触发scheduleTraversals,执行遍历,重新               进行布局layout测量measure绘制draw方法。

  所以最终会回调到了ImageView的onDraw方法中,ondraw方法中会调用drawable.draw方法。

       在draw方法中,传递进来一个画布canvas,最终会把该drawable转成一个bitmap绘制在canvas上,然后交给Native层,在屏幕上进行呈现。

 @Override
    protected void onDraw(Canvas canvas) {
      if (mDrawMatrix == null && mPaddingTop == 0 && mPaddingLeft == 0) {
            mDrawable.draw(canvas);
        } else {
           ........
            mDrawable.draw(canvas);
          .........
            
        }
    }

   2.BitmapFactory相关方法介绍:

//从drable目录下加载一个Bitmap
BitmapFactory.decodeResource(getResources(), R.drawable.girl); 
//把指定文件解析成一个Bitmap
BitmapFactory.decodeFile(file); 
//从内存数组中解析成一个Bitmap
BitmapFactory.decodeByteArray(byteArray,offset,lenght); 
//从流中加载一个Bitmap,
 //这个可以是一个文件流,读取本地的一个缓存文件
//也可以是一个网络流,从网络获取。
BitmapFactory.decodeStream(inputStream);

   1)从文件中读取一张图片,由于设计到文件io操作,最好是放在子线程中。

        示例:通过RxJava读取一张图片到内存。

        首先在build.gragle引入Rxjava相关jar包:

implementation 'io.reactivex.rxjava2:rxandroid:2.1.0'
    implementation 'io.reactivex.rxjava2:rxjava:2.2.4'

       代码实现:

public void createBitmap(ImageView imageView,String file) {
        Observable.create(new ObservableOnSubscribe<String>() {
            @Override
            public void subscribe(ObservableEmitter<String> emitter) throws Exception {
                emitter.onNext(file);
            }
        }).subscribeOn(Schedulers.io()).map(new Function<String, Bitmap>() {

            @Override
            public Bitmap apply(String file) throws Exception {
                return BitmapFactory.decodeFile(file);
            }
        }).observeOn(AndroidSchedulers.mainThread()).subscribe(new Consumer<Bitmap>() {
            @Override
            public void accept(Bitmap bitmap) throws Exception {
                imageView.setImageBitmap(bitmap);
            }
        });
    }

  2)从网络获取图片示例:

/**
     * 获取网络图片
     *
     * @param imageurl 图片网络地址
     * @return Bitmap 返回位图
     */
    public Bitmap GetImageInputStream(String imageurl) {
        URL url;
        HttpURLConnection connection = null;
        Bitmap bitmap = null;
        try {
            url = new URL(imageurl);
            connection = (HttpURLConnection) url.openConnection();
            connection.setConnectTimeout(6000); //超时设置
            connection.setDoInput(true);
            connection.setUseCaches(false); //设置不使用缓存
            InputStream inputStream = connection.getInputStream();
 
            BitmapFactory.Options options = new BitmapFactory.Options();
            options.inSampleSize = 2;
            options.inJustDecodeBounds = false;
 
            bitmap = BitmapFactory.decodeStream(inputStream, null, options);
            inputStream.close();
 
        } catch (Exception e) {
            e.printStackTrace();
        }
        return bitmap;
    }

3.BitmapFactory.Options

     1)options.inJustDecodeBounds = true;不把图加载到内存,只获取宽高。 

        FileInputStream fis = new FileInputStream("fileName");
        BitmapFactory.Options options = new BitmapFactory.Options();
        //为true则只加载图片的大小,返回一个null值,不会把图片加载到内存
        options.inJustDecodeBounds = true;
        BitmapFactory.decodeStream(fis, null, options);
        //得到图片的宽高
        int imgWidth = options.outWidth;
        int imgHeight = options.outHeight;

   2) options.inSampleSize = 2; 设置值大于1,加载的图片大小是原理的4分之1,

        BitmapFactory.Options options = new BitmapFactory.Options();
        options.inSampleSize = 2;
        Bitmap bitmap = BitmapFactory.decodeFile(imageFile,options);

4.创建Bitmap:Bitmap.createBitmap()

   1)代码示例:把View保存到一个bitmap:

 public static Bitmap getBitmapForView(View view) {
        int width = view.getWidth();
        int height = view.getHeight();
        Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);//准备图片
        Canvas canvas = new Canvas(bitmap);//将bitmap作为绘制画布
        view.draw(canvas);//讲View特定的区域绘制到这个canvas(bitmap)上去,
        return bitmap;//得到最新的画布
    }

  2)从一个bitmap得到另外一个大小的bitmap

        Bitmap srcBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.girl);
        int x = 0;
        int y = 0 ;
        float rate = 1.5f;
        int width = (int) (srcBitmap.getWidth()*rate);
        int height = (int) (srcBitmap.getHeight()*rate);
        Bitmap bitmap = Bitmap.createBitmap(srcBitmap,x,y,width,height);

3)将内存中的一个bitmap保存为一张本地图片:

  Bitmap srcBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.girl);
        try {
            FileOutputStream fos = new FileOutputStream("fileName");
            srcBitmap.compress(Bitmap.CompressFormat.JPEG,100,fos);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }

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

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

相关文章

MySQL单表查询基础综合练习

一、单表查询 素材&#xff1a; 表名&#xff1a;worker-- 表中字段均为中文&#xff0c;比如 部门号 工资 职工号 参加工作 等 CREATE TABLE worker ( 部门号 int(11) NOT NULL, 职工号 int(11) NOT NULL, 工作时间 date NOT NULL, 工资 float(8,2) NOT NULL, 政治面貌 v…

三勾知识付费(PHP+vue3)微信小程序平台+SAAS+前后端源码

项目介绍 三勾小程序商城基于thinkphp8element-plusuniapp打造的面向开发的小程序商城&#xff0c;方便二次开发或直接使用&#xff0c;可发布到多端&#xff0c;包括微信小程序、微信公众号、QQ小程序、支付宝小程序、字节跳动小程序、百度小程序、android端、ios端。 软件架…

BUUCTF学习(二):一起来撸猫

1、介绍 2、解题 &#xff08;1&#xff09;查看网页源代码 &#xff08;2&#xff09;解读代码内容 &#xff08;3&#xff09;得出结论 网址&#xff1a;一起来撸猫http://df4c147d-c7f4-4aac-a9d6-fdce2606ee18.node4.buuoj.cn:81/?catdog 第二题结束

PyTorch入门教学——在虚拟环境中安装Jupyter

1、简介 Jupyter Notebook是一个开源的web应用程序&#xff0c;可以使用它来创建和共享包含实时代码、方程、可视化和文本的文档。Jupyter Notebook是一个交互式笔记本&#xff0c;可以当作python编译器来使用。 2、安装 在安装Anaconda时是自带了Jupyter Notebook的&#x…

Unity第一人称移动和观察

创建一个可以自由移动的第一人称视角 人物通过WSAD进行前后左右移动&#xff0c;通过鼠标右键进行旋转 Step1:创建一个Player玩家&#xff0c;在节点下加两个子物体&#xff0c;一个摄像头和一个Capsule充当身体 Step2:创建一个脚本挂载在Player节点下&#xff0c;再在这个Pl…

ThreeJS-3D教学十-有宽度的line

webgl中线是没有宽度的&#xff0c;现实的应用中一般做法都是将线拓宽成面来绘制。默认threejs的线宽是无法调节的&#xff0c;需要用有厚度的线 THREE.Line2。 先看效果图&#xff1a; 看下代码&#xff1a; <!DOCTYPE html> <html lang"en"> <he…

2022年03月 Python(二级)真题解析#中国电子学会#全国青少年软件编程等级考试

Python编程&#xff08;1~6级&#xff09;全部真题・点这里 C/C编程&#xff08;1~8级&#xff09;全部真题・点这里 一、单选题&#xff08;共25题&#xff0c;每题2分&#xff0c;共50分&#xff09; 第1题 关于Python中的列表&#xff0c;下列描述错误的是?&#xff08; …

BUUCTF在线评测简介

1、网站 BUUCTF在线评测简介 BUUCTF在线评测 BUUCTF在线评测BUUCTF 是一个 CTF 竞赛和训练平台&#xff0c;为各位 CTF 选手提供真实赛题在线复现等服务。https://buuoj.cn/challenges 2、介绍 3、学习步骤 学习从这里开始&#xff01;

深入剖析 深度学习中 __init()__函数和forward()函数

目录 前言1. __init()__函数2. forward()函数3. 两者关系 前言 再看代码时&#xff0c;发现init函数和forward函数都有参数&#xff0c;具体是怎么传参的呢&#xff1f; 为了更方便的讲解&#xff0c;会举简单的代码例子结合讲解。 forward() 和 __init__() 是神经网络模型类…

甘特图:如何制定一个有效的项目计划?需要考虑这些方面

一个清晰、可行的计划能够为团队提供明确的方向&#xff0c;确保项目顺利执行&#xff0c;缺乏明确的计划可能导致项目偏离轨道。 甘特图是一种通过条状图形来表示项目和进度的工具&#xff0c;由于其具有视觉化的优点&#xff0c;使得管理者能够更容易地掌握项目进展情况。因…

安捷伦N8485A射频传感器26.5GHz

安捷伦N8485A射频传感器 N8485A 是 Agilent 使用的 26.5 GHz 0.1 瓦射频传感器。电子测试设备传感器测量波形的功率&#xff0c;例如多音和调制射频 (RF) 波形。传感器使用二极管检测器收集高度精确的调制测量值。 用于存储校准系数的 EEPROM 消除了手动输入 10 MHz 至 26.5 GH…

lombok保姆教学

初始化准备工作 所有的环境如下&#xff1a; jdk1.8或者jdk11Springboot2.xmysql5.7或者mysql8.0 首先创建Springboot工程&#xff0c;初次创建初始化速度慢 如果想指定单个项目的maven中央仓库&#xff0c;pom中的配置如下&#xff1a; <!-- 代码库 --><reposito…

BUUCTF学习(一):SQL注入,万能密码

1、场景 2、题目 3、解题 用户名&#xff1a;admin or 11# 密码&#xff1a;123456 4、解析SQL注入 “SQL注入是一种常见的Web应用程序漏洞&#xff0c;攻击者可以通过注入的SQL语句获取数据库的敏感信息&#xff0c;对网站用户的数据安全造成威胁。SQL注入的特点包括广泛性、隐…

如何将领导发的jar包安装到本地的maven仓库

第一步&#xff1a;打开idea右侧的maven功能选择这个图标 第二步&#xff1a;输入maven指令 这个的pom文件的maven管理 1.这个是同一个文件夹下面导入两个jar包。如jdk16和javadoc mvn install:install-file -DfileD:\java\maven\myDepot\aspose-words-16.8.0-jdk16.jar -D…

websocket+node+vite(vue)实现一个简单的聊天

1.前端逻辑 本项目基于之前搭建的vite环境&#xff1a;https://blog.csdn.net/beekim/article/details/128083106?spm1001.2014.3001.5501 新增一个登录页和聊天室页面 <template><div>登录页</div><div>用户名:<input type"text" pl…

uniapp开发H5微信公众号,使用微信的扫一扫等Api试错

记录使用uniapp开发H5微信公众号,有些业务需要用到一些API&#xff0c;比如扫码&#xff0c;h5和微信小程序&#xff0c;app在使用过程中有有些不同&#xff0c;h5使用需要单独引入微信的jsdk,才能使用否则会报错无法使用 引入微信jsdk npm安装 npm install jweixin-module -…

一款优秀的文件外发控制软件 具备哪些优势?

随着越来越多的公司在网上开展业务&#xff0c;网络安全漏洞也相应增加。因此&#xff0c;企业需要保护自己的数据&#xff0c;防止数据泄露&#xff0c;给企业带来损失。近几年来&#xff0c;企业数据泄露事件频发&#xff0c;给许多企业都带来巨大创伤。 乌克兰电力公司在201…

【python入门篇】元组、字典和集合(3)

先来介绍下这三种数据类型&#xff0c;第一个&#xff1a;元组&#xff08;tuple&#xff09;是 python中另一个重要的序列结构&#xff0c;和列表类似&#xff0c;元组也是由一系列按特定顺序排序的元素组成。第二个&#xff1a;python 字典&#xff08;dict&#xff09;是一种…

AIGC|数字时代巨变,创新潮流涌现,万亿市值风口已开!

“2021年至2023年7月期间&#xff0c;AIGC赛道共发生280笔投融资&#xff0c;展现了其高热度与高成长性。在获投的应用与模型层创业项目中&#xff0c;文本、影像、语音平分秋色。”艾瑞咨询在其《2023年中国AIGC产业全景报告》披露国内AIGC的最新投融资情况&#xff0c;这让我…

关于IOC与IOA的学习

[TOC]IOC与IOA学习 IoC 和 IoA&#xff1a;两者有什么区别&#xff1f; IoC 和 IoA 可通过以下四种简单的方法进行区分&#xff1a; 具体工具与动机&#xff1a; IoC 专注于攻击者为实现其意图而使用的特定文件和采取的行动&#xff0c;而 IoA 则专注于这些意图本身。IoC 关…