1. 程式人生 > >Android控制元件之ImageView(一)

Android控制元件之ImageView(一)

前言

Hi,喜歡每天練習的小夥伴肯定對上一篇的Button瞭如指掌了,那麼今天我們為大家帶來了ImageView控制元件,這個控制元件能與Button碰撞出什麼樣的火花呢?話不多說,讓我們趕緊開始學習吧~

簡介

ImageView的結構

public class ImageView extends View

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

已知直接子類:

ImageButtonQuickContactBadge

已知間接子類:

ZoomButton

ImageView(影象檢視),直接繼承自View類,它的主要功能是用於顯示圖片,實際上它不僅僅可以用來顯示圖片,任何Drawable物件都可以使用ImageView

來顯示。ImageView可以適用於任何佈局中,並且Android為其提供了縮放和著色的一些操作。

一. 簡單使用

下面我們簡單的介紹ImageView的使用(再此示例中,需要使用到一個ic_luffy.png的圖片,需要放到res資料夾下drawable資料夾中):

  • 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,裡面有各種大神回答小夥伴們遇到的問題,我們的微信群馬上也將要和大家見面啦,屆時希望大家踴躍加入其中~~

相關推薦

Android控制元件ImageView()

前言 Hi,喜歡每天練習的小夥伴肯定對上一篇的Button瞭如指掌了,那麼今天我們為大家帶來了ImageView控制元件,這個控制

Android開發學習筆記(十二)基礎UI控制元件ImageView、CheckBox、RadioButton

一、ImageView:直接繼承自View,它的作用是在介面上顯示Drawable物件。 ImageView在佈局檔案(如main_activity.xml)中常用的屬性 有 scaleType ,s

Android 控制元件 RecyclerView()—— 載入檢視和佈局選擇

本文目錄 一、概述 二、列表檢視的處理 1. item 的佈局檔案 2. 構造 Adapter 類 3. 佈局管理器 1)LinearLayoutManager 2)GridLayoutManager

android控制元件AutoCompleteTextView下拉列表顯示片空白

在使用AutoCompleteTextView控制元件時,出現控制元件的下拉列表顯示為空白, 當選中下拉列表的某一欄時卻能看見內容的現象。 原始碼:ArrayAdapter adapter = new ArrayAdapter(AutoComplite.this, and

Android控制元件LabelView

          最近研究android控制元件開發,學習無捷徑,逛github,看到一個LabelView的demo,感覺還是挺不錯,也比較實用,所以拿來學習了一下。         附上源專案的地址:

Android控制元件圓形進度條

Android-自定義ProgressBar實現圓弧進度條 在之前的專案中用到過這個,感覺還是非常實用的,我實現的是額度的增長. 繼承於ProgressBar實現,保留了Progressbar的特性,原始碼在文尾。

Android 四大元件——Service()

一、什麼是服務        服務,是Android四大元件之一, 屬於 計算型元件。   長期後臺執行的沒有介面的元件 ,特點是無使用者介面、在後臺執行、生命週期長 二,什麼時候使用服務?  

Android 四大元件——Acitivity()

一,什麼是Activity activity是Android元件中最基本也是最為常見用的四大元件之一。Android四大元件有Activity,Service服務,Content Provider內容提供,BroadcastReceiver廣播接收器。 Activity中所有操作都與使用

Android控制元件ListView(初識)

ListView 控制元件可使用四種不同檢視顯示專案。通過此控制元件,可將專案組成帶有或不帶有列標頭的列,並顯示伴隨的圖示和文字。 ListView有四種模式: 其作用是新增選擇按鈕框。 設定單選框 Lv.setChoiceMode(ListView.CHOICE_MOD

Android控制元件AutoCompleteTextView提示輸入

效果圖  AutoComepleteTextView 控制元件的主要的作用是在使用者輸入中,提示輸入。但是隻能提示一次。這裡就出項了MultiautoCompleteTextView控制元件,其主要的功能是也是在使用者輸入中提示輸入。 AutoComepleteTextVie

Android控制元件RecyclerView的基本使用

三、RecyclerView使用時要匯入android.suport.v7.wedget.RecyclerView包。 RecyclerView實現新增和刪除的簡單例子 <span style="font-size:18px;">public class MainActivity extend

Android控制元件SlidingDrawer(滑動式抽屜)詳解與例項

SlidingDrawer效果想必大家也見到過,它就是1.5模擬器上進入應用程式列表的效果。下面是截圖  一、簡介    SlidingDrawer隱藏屏外的內容,並允許使用者通過handle以顯示隱藏內容。它可以垂直或水平滑動,它有倆個View組成,其

EXT控制元件我見()

EXT控制元件之我見 最近第一次接觸用ASP.NET做bs架構的專案,以前接觸過Java做的bs系統,但是asp.net的bs系統還是第一次接觸。因為主要負責資料庫的設計工作,所以首先考慮的是如何對資料庫進行設計,比如業務流程資料的關聯性,增加某個系統後臺資料的關聯性等資訊

Android開發:Android控制元件Spinner

public class SpinnerDemo extends Activity {    @Override      public void onCreate(Bundle savedInstanceState) {          super.onCreate(savedInstanceState)

Android控制元件帶清空按鈕(功能)的AutoCompleteTextView自動提示

功能折騰完了記錄一下。帶刪除按鈕的AutoCompleteTextView,普通的自動提示控制元件用起來比較簡單,準備好陣列給控制元件setAdapter一下行了,這裡要說的是提取sqlite中的資料繫結並且加上清空按鈕,先來張圖片。 最初沒有用過AutoComplet

android控制元件ZoonControls(縮放控制元件)的使用

我們在android開發的過程中經常看到的縮放圖示按鈕。 ZoomControls的使用,主要是監聽兩個事件: OnZoomInClickListener(放大監聽事件) OnZoomOutClickListener(縮小監聽事件) 該控制元件使用非常簡單。 以縮放tex

自定義控制元件ImageView實現點選之後有陰影效果

今天美工 直接給我一張圖片, 要我實現圖片點選之後有陰影效果, 當時想到了ImageButton, 隨即自己寫了個Demo, 發現ImageButton繼承ImageView 會有一個預設的背景樣式;而且在佈局中設計src(前景) 太醜, 於是,自己寫了個自定義控制元件Im

Android控制元件WebView(網頁調轉回APP)

問題來源:網頁跳轉回應用 APP開啟網頁,網頁放置在伺服器中(例如,APP開啟百度網頁),開啟網頁之後在某一時刻需要從網頁在跳轉回到APP。 實現原理:使用URI再加上Intent來實現。 URI介紹: 就Android平臺而言,URI主要分三個部分:s

Android四大元件服務()-----服務基礎功能簡述

服務(Service)是android的四大元件之一,在Android專案中擔任著後臺執行的大任,主要去完成那些不需要和使用者互動而且還要求長時間執行在後臺的工作。服務的執行不會對使用者使用app造成任何影響,這個元件屬於很常用的元件,幾乎每一款app產品都會用到,比如後臺

Android控制元件ProgressBar基本用法

1、ProgressBar控制元件簡介 ProgressBar類的繼承關係 java.lang.Object android.view.View android.widget.ProgressBar 在某些操作的進度中的可視指示器,為使用者呈現操作的進度,它還有一個次要的進