Hi,喜欢天天练习的小伙伴确定对上一篇的Button了如指掌了,那么今天咱们为你们带来了ImageView控件,这个控件能与Button碰撞出什么样的火花呢?话很少说,让咱们赶忙开始学习吧~java
ImageView的结构android
public class ImageView
extends View数组
java.lang.Object ↳android.view.View ↳android.widget.ImageView
已知直接子类:安全
ImageButton
, QuickContactBadge
微信
已知间接子类:app
ZoomButton
ide
ImageView
(图像视图),直接继承自View类,它的主要功能是用于显示图片,实际上它不只仅能够用来显示图片,任何Drawable对象均可以使用ImageView
来显示。ImageView
能够适用于任何布局中,而且Android为其提供了缩放和着色的一些操做。布局
下面咱们简单的介绍ImageView
的使用(再此示例中,须要使用到一个ic_luffy.png的图片,须要放到res文件夹下drawable文件夹中):学习
android:src
:设置ImageView
所显示的Drawable对象的ID。而咱们也能够经过代码设置图像,运行后的结果和上述中同样:ui
/** * @author: 下码看花 * date: 2019年8月16日 * description: ImageView的使用 */ public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ImageView ivPic = findViewById(R.id.iv_picture); ivPic.setImageResource(R.drawable.ic_luffy); } }
部分小伙伴看完后可能会有点儿好奇,我随便写一个Layout
再设置一个android:background
属性也能够作到展现图片,为何还要特意去使用ImageView
呢?这就不得不要说一下android:src
属性和android:background
的区别了:
在API文档中咱们发现ImageView
有两个能够设置图片的属性(任意继承自View
的控件都包含background
属性),分别是:src和background
常识:
①android:background
一般指的都是背景,而android:src
指的是内容!!
②当使用android:src
填入图片时,是按照图片大小直接填充,并不会进行拉伸
而使用android:background
填入图片,则是会根据ImageView
给定的宽度来进行拉伸
让咱们看一个示例:
咱们将图片的宽高属性设置为固定值,而且给图片增长background
属性,咱们能够直观的发现,第一张图片明显出现了拉伸,而第二张图片未出现变化,验证上述结论的正确性。
而ImageView
还有不少有趣的属性:
android:maxHeight
:设置ImageView的最大高度;android:maxWidth
:设置ImageView的最大宽度;android:adjustViewBounds
:设置ImageView是否调整本身的边界来保持所显示图片的长宽比,须要结合android:maxWidth
、android:maxHeight
一块儿使用不然单独使用没有效果,而且设置layout_width
和layout_height
为wrap_content
;android:scaleType
:设置所显示的图片如何缩放或移动以适应ImageView的大小。对于android:scaleType
属性,由于关于图像在ImageView
中的显示效果,因此有以下属性值能够选择:
matrix
:使用matrix
方式进行缩放。fitXY
:横向、纵向独立缩放,以适应该ImageView
;fitStart
:保持纵横比缩放图片,而且将图片放在ImageView
的左上角;fitCenter
:保持纵横比缩放图片,缩放完成后将图片放在ImageView
的中央;fitEnd
:保持纵横比缩放图片,缩放完成后将图片放在ImageView
的右下角;center
:把图片放在ImageView
的中央,可是不进行任何缩放;centerCrop
:保持纵横比缩放图片,以使图片能彻底覆盖ImageView;centerInside
:保持纵横比缩放图片,以使得ImageView
能彻底显示该图片;上述的几个属性小编就不给你们作具体展现了,但愿各位小伙伴能够自主尝试。
在上述中,只是简单的介绍加载资源文件中的图片以及ImageView的一些基本属性,接下来,咱们为你们讲解如何加载SD卡中的图片,而且咱们考虑到部分小伙伴对Android很感兴趣,可是都是使用本身的手机来进行调试,那么如何让本身手机中的照片展现到实际项目,赶忙继续往下看吧!
首先,咱们开发者要知道,从Android 6.0(API 23)开始,对系统权限作了很大的改变。在以前用户安装APP前,只是把APP须要使用的权限列出来给用户告知一下(直接在AndroidManifest.xml
中声明就能够),APP安装后均可以访问这些权限。从6.0开始,一些敏感权限(权限主要分为normal、dangerous、signature和signatureOrSystem四个等级,常规状况下咱们只须要了解前两种,即正常权限和危险权限。),须要在使用时动态申请,而且用户能够选择拒绝受权访问这些权限,已授予过的权限,用户也能够去APP设置页面去关闭受权。这对用户来讲提升了安全性,能够防止一些应用恶意访问用户数据,可是对于开发来讲,也增长了很多工做量,这块不作适配处理的话,APP在访问权限的时候会容易崩溃。
package com.xmkh.imagetest; import android.Manifest; import android.content.pm.PackageManager; import android.net.Uri; import android.os.Build; import android.os.Bundle; import android.os.Environment; import android.support.annotation.NonNull; import android.support.v4.app.ActivityCompat; import android.support.v4.content.ContextCompat; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.widget.Button; import android.widget.ImageView; import java.io.File; /** * @author: 下码看花 * date: 2019年8月16日 * description: ImageView的使用 */ public class MainActivity extends AppCompatActivity { /** * 用于请求值使用 */ private final int PERMISSION_REQUEST = 100; /** * 加载图片用的ImageView */ private ImageView ivPic; /** * 点击后去加载图片 */ private Button btnLoad; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //由于小编使用的是android6.0版本以上的手机,须要动态申请权限 //而Android6.0如下的手机,只需在AndroidManifest.xml中写入权限就能够 if (Build.VERSION.SDK_INT >= 23) { //申请的权限数组 String[] mPermissionList = new String[]{ //SD卡写入权限 Manifest.permission.WRITE_EXTERNAL_STORAGE, //SD卡读取权限 Manifest.permission.READ_EXTERNAL_STORAGE, //访问电话状态 Manifest.permission.READ_PHONE_STATE, //访问摄像机权限 Manifest.permission.CAMERA }; //如下int数值都是申请权限后的返回值,0表示赞成(PackageManager.PERMISSION_GRANTED),-1表示拒绝(PERMISSION_DENIED) //而咱们为了读取到SD卡中的数据,须要点赞成 int checkSPermission = ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE); int checkSPermission2 = ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE); int checkSPermission3 = ContextCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE); int checkSPermissionCAMERA = ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA); //判断用户是否容许了咱们所需权限 if ((checkSPermission != PackageManager.PERMISSION_GRANTED) || (checkSPermission2 != PackageManager.PERMISSION_GRANTED) || (checkSPermission3 != PackageManager.PERMISSION_GRANTED) || (checkSPermissionCAMERA != PackageManager.PERMISSION_GRANTED)) { ActivityCompat.requestPermissions(this, mPermissionList, PERMISSION_REQUEST); } } ivPic = findViewById(R.id.iv_picture); btnLoad = findViewById(R.id.btn_load); btnLoad.setOnClickListener(new View.OnClickListener() { /** * 在点击以前,其实还应该再次判断用户是否受权 * 可是为了不重敲一遍上述代码小编就省略啦,可是小伙伴在实际开发中必定要写!!!! * @param view */ @Override public void onClick(View view) { //Environment.getExternalStorageDirectory().getAbsolutePath()方法是获取手机SD卡的绝对路径 //而绝对路径就是你SD卡的最上层文件夹(就比如还未双击的C盘) //而/xmkh表示的是文件夹(至关于C盘中的一个文件夹)的名字 //而/xmkh.png表示的是你要加载的本地图片(至关于C盘中xmkh文件夹下的一个图片) String path = Environment.getExternalStorageDirectory().getAbsolutePath() + "/xmkh/xmkh.png"; //Uri咱们前面的文章ContentProvider已经讲过了,忘记了的小伙伴能够去复习一下~ Uri uri = Uri.fromFile(new File(path)); //经过setImageURI设置路径 ivPic.setImageURI(uri); } }); } /** * 请求权限回调方法(有兴趣的小伙伴能够本身尝试一下在这个方法中写一些东西,不懂的能够给咱们留言哦~) * * @param requestCode 请求值(PERMISSION_REQUEST) * @param permissions 对应咱们上面写到的mPermissionList * @param grantResults 对应mPermissionList中请求权限返回结果的数组 * (数组的长度与mPermissionList相等,数组中的内容就是PERMISSION_GRANTED或者PERMISSION_DENIED,并表示对应权限是否开启) */ @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); } }
效果图以下:
看了上述的一个demo展现,可能有的小伙伴表示太麻烦了,难道我得找到每张图片的路径才能够去加载图片嘛?并且一些小伙伴阔能使用的是本身的手机,相册都不知道在哪一个文件夹下,不要紧,接下来咱们就教你如何从相册中选取照片并经过ImageView
进行加载!!
btnLoad.setOnClickListener(new View.OnClickListener() { /** * 必定要记得再次判断权限!! * @param view */ @Override public void onClick(View view) { //调用图库,获取全部本地图片 Intent intent = new Intent(Intent.ACTION_GET_CONTENT); //第一个参数是Uri,其实就是经过我们以前讲到过的四大组件ContentProvider根据Uri进行查找SD卡中的全部的图片 //只不过这是系统封装了一个方法不用咱们本身去写(一环套一环,ContentProvider的重要性不用我再强调了吧~) intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*"); //INTENT_MEDIA_REQUEST_CODE是咱们须要在onActivityResult方法中的识别码,识别是不是从相册返回的数据,与PERMISSION_REQUEST做用相同 startActivityForResult(intent, INTENT_MEDIA_REQUEST_CODE); } });
/** * @param requestCode 咱们startActivityForResult中第二个参数,用于区分是哪一个Intent的返回 * @param resultCode 返回值经常使用的有RESULT_OK(成功)和RESULT_CANCELED(取消或者失败) * @param data 返回数据 */ @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (resultCode == RESULT_OK) { switch (requestCode) { case INTENT_MEDIA_REQUEST_CODE: if (data != null) { //根据返回的Uri展现图片 ivPic.setImageURI(data.getData()); } break; default: break; } } }
为了效率,咱们把主要代码进行了展现,其余部分代码依然没有变化,小伙伴能够放心尝试,运行效果以下:
其实ImageView
还有不少属性和方法:
ImageView
设置透明度主要有如下几种方法:
android:alpha // 0f~1f
setAlpha(float alpha); // 0f~1f
setAlpha(int alpha); // 0~255,已过期
setImageAlpha(int alpha); // API>=16
setlmageBitmap(Bitmap bm)
:使用 Bitmap 位图设置该 ImageView 显示的图片。setlmageDrawable(Drawable drawable)
:使用 Drawable 对象设置该 ImageView 显示的图片。其余属性就要靠你们本身摸索啦,或者加入咱们的扣扣群,你想知道的内容都会有人回复,以上就是咱们今天所要讲解的所有重要内容,下一章更精彩,看好标题哦,今天只是ImageView
第一讲~
PS:若是还有未看懂的小伙伴,欢迎加入咱们的QQ技术交流群:892271582,里面有各类大神回答小伙伴们遇到的问题,咱们的微信群立刻也将要和你们见面啦,届时但愿你们踊跃加入其中~~