Android控件之ImageView(一)

前言

Hi,喜歡天天練習的小夥伴確定對上一篇的Button瞭如指掌了,那麼今天咱們爲你們帶來了ImageView控件,這個控件能與Button碰撞出什麼樣的火花呢?話很少說,讓咱們趕忙開始學習吧~java

簡介

ImageView的結構android

public class ImageView extends View數組

java.lang.Object
↳android.view.View
↳android.widget.ImageView安全

已知直接子類:微信

ImageButtonQuickContactBadgeapp

已知間接子類: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:maxWidthandroid:maxHeight一塊兒使用不然單獨使用沒有效果,而且設置layout_widthlayout_heightwrap_content
  • android:scaleType:設置所顯示的圖片如何縮放或移動以適應ImageView的大小。

對於android:scaleType屬性,由於關於圖像在ImageView中的顯示效果,因此有以下屬性值能夠選擇:

  • matrix:使用matrix方式進行縮放。
  • fitXY:橫向、縱向獨立縮放,以適應該ImageView
  • fitStart:保持縱橫比縮放圖片,而且將圖片放在ImageView的左上角;
  • fitCenter:保持縱橫比縮放圖片,縮放完成後將圖片放在ImageView的中央;
  • fitEnd:保持縱橫比縮放圖片,縮放完成後將圖片放在ImageView的右下角;
  • center:把圖片放在ImageView的中央,可是不進行任何縮放;
  • centerCrop:保持縱橫比縮放圖片,以使圖片能徹底覆蓋ImageView;
  • centerInside:保持縱橫比縮放圖片,以使得ImageView能徹底顯示該圖片;

上述的幾個屬性小編就不給你們作具體展現了,但願各位小夥伴能夠自主嘗試。

二. 加載SD卡中的圖片

在上述中,只是簡單的介紹加載資源文件中的圖片以及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,裏面有各類大神回答小夥伴們遇到的問題,咱們的微信羣立刻也將要和你們見面啦,屆時但願你們踊躍加入其中~~

相關文章
相關標籤/搜索