Hi,喜歡天天練習的小夥伴確定對上一篇的Button瞭如指掌了,那麼今天咱們爲你們帶來了ImageView控件,這個控件能與Button碰撞出什麼樣的火花呢?話很少說,讓咱們趕忙開始學習吧~java
ImageView的結構android
public class ImageView extends View數組
java.lang.Object
↳android.view.View
↳android.widget.ImageView安全
已知直接子類:微信
ImageButton
, QuickContactBadge
app
已知間接子類:ide
ZoomButton
佈局
ImageView
(圖像視圖),直接繼承自View類,它的主要功能是用於顯示圖片,實際上它不只僅能夠用來顯示圖片,任何Drawable對象均可以使用ImageView
來顯示。ImageView
能夠適用於任何佈局中,而且Android爲其提供了縮放和着色的一些操做。學習
下面咱們簡單的介紹ImageView
的使用(再此示例中,須要使用到一個ic_luffy.png的圖片,須要放到res文件夾下drawable文件夾中):ui
android:src
:設置ImageView
所顯示的Drawable對象的ID。而咱們也能夠經過代碼設置圖像,運行後的結果和上述中同樣:
/** * @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,裏面有各類大神回答小夥伴們遇到的問題,咱們的微信羣立刻也將要和你們見面啦,屆時但願你們踊躍加入其中~~