android引用圖片
A. android獲取drawable裡面的圖片的id和名字的方法
你好,看樣子你可能是剛接觸Android不久,我先就你想實現的問題給你解答。你問題的本質是要在ImageView上展示圖片,你需要理解以下幾點:
1、ImageView這個組件可以直接設置Bitmap和Drawable來展示圖片,方法分別是setImageBitmap()和setImageDrawable()
2、根據(1)我們需要使用Drawable,Drawable可以由drawable目錄里的圖片資源生成,在這之前你需要理解一個概念,我們向drawable目錄放入一張圖片是需要命名的,比如圖片名為sun.png,系統會幫助我們自動生成這個圖片的id,如果想在java代碼中引用這個圖片就需要使用這個id,使用方式:R.drawable.sun。
3、使用系統方法將圖片轉換為Drawable。
Drawable drawable = getResources().getDrawable(R.drawable.sun);
imageView.setImageDrawable(drawable);
這樣就可以將圖片顯示到ImageView上。
這裡面使用的getResources()方法獲取的Resources對象可以幫助我們獲取很多資源文件,這個方法可以直接在Activity里使用,在其他地方需要使用Context對象調用。此外,Resources的getDrawable方法已被標記為過時,系統推薦使用兩個參數的方法。getDrawable(int id, Theme theme),我們不需要設置Theme可以給null。
4、題外話
1)現在圖片資源已經很少放在drawable目錄里,而是放在mipmap目錄,引用方式R.mipmap.xxx
2)你的問題涉及到id和名字,名字是你把圖片放到目錄時自己起的,命名要符合規范。而id則是由系統自動幫你生成,且是固定格式:R.drawable.xxx
B. 求:android 獲取系統相冊圖片並顯示在當前頁面的代碼
先初始化;
注意自定義 的
private final String IMAGE_TYPE = "image/*";private final int IMAGE_CODE = 0;
private void setImage() {
Intent getAlbum = new Intent(Intent.ACTION_GET_CONTENT); getAlbum.setType(IMAGE_TYPE); startActivityForResult(getAlbum, IMAGE_CODE);}
這里使用Intent獲得相冊圖片數據,並返回原來界面;
這里說明一下
startActivityForResult(getAlbum, IMAGE_CODE);
補充{
startActivityForResult與startActivity的不同之處在於:
1、startActivity( )
僅僅是跳轉到目標頁面,若是想跳回當前頁面,則必須再使用一次startActivity( )。
2、startActivityForResult( )
可以一次性完成這項任務,當程序執行到這段代碼的時候,假若從T1Activity跳轉到下一個Text2Activity,而當這個Text2Activity調用了finish()方法以後,程序會自動跳轉回T1Activity,並調用前一個T1Activity中的onActivityResult( )方法。
}
startActivityForResult(getAlbum, IMAGE_CODE);
這里採用startActivityForResult來做跳轉,此處的IMAGE_CODE實質是0為一個依據,可以寫其他的值,但一定要>=0
然後重寫onActivityResult用於接收剛剛得到的數據
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
Bitmap bm = null; ContentResolver resolver = getContentResolver(); if (requestCode == IMAGE_CODE) { try {
Uri originalUri = data.getData(); bm = MediaStore.Images.Media.getBitmap(resolver, originalUri); imgShow.setImageBitmap(bm); } catch (IOException e) {
e.printStackTrace(); }
}
補充{
ContentProvider-----數據提供給第三方應用程序使用時使用
因為在Android系統裡面,資料庫是私有的。一般情況下外部應用程序是沒有許可權讀取其他應用程序的數據。如果你想公開你自己的數據,你有兩個選擇:你可以創建你自己的內容提供器(一個ContentProvider子類)或者你可以給已有的提供器添加數據-如果存在一個控制同樣類型數據的內容提供器且你擁有寫的許可權
}
這里是創建一個新的內容提供器,然後在Activity當中通過getContentResolver()可以得到當前應用的 ContentResolver實例
if (requestCode == IMAGE_CODE) {
resultCode為回傳的標記這句話是在確認是否回傳的是你所需要的;如果是就執行try;不然就執行catch (IOException e) {
e.printStackTrace();}先說這里當try語句中出現異常是時,會執行catch中的語句,IOException e也就是實例化Exception類型的對象。e是此對象引用名稱。然後e(引用)會自動調用Exception類中指定的方法,也就出現了e.printStackTrace() ;。printStackTrace()方法的意思是:在命令行列印異常信息在程序中出錯的位置及原因。
try {
Uri originalUri = data.getData(); bm = MediaStore.Images.Media.getBitmap(resolver, originalUri); imgShow.setImageBitmap(bm);接收數據處理數據並顯示照片。
然後進行測試。
另附源碼:
MainActivity:
package com.example.administrator.myapplication1;import android.graphics.BitmapFactory;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import java.io.IOException;import android.net.Uri;import android.os.Bundle;import android.provider.MediaStore;import android.app.Activity;import android.content.ContentResolver;import android.content.Intent;import android.graphics.Bitmap;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.ImageView;public class MainActivity extends AppCompatActivity { private final String IMAGE_TYPE = "image/*"; private final int IMAGE_CODE = 0; private Button choose=null; private ImageView imgShow; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); init();} private void init() { choose=(Button) findViewById(R.id.button1); imgShow=(ImageView) findViewById(R.id.imgShow); choose.setOnClickListener(listener); } private OnClickListener listener=new OnClickListener(){ @Override public void onClick(View v) {
setImage(); }
}; private void setImage() {
Intent getAlbum = new Intent(Intent.ACTION_GET_CONTENT); getAlbum.setType(IMAGE_TYPE); startActivityForResult(getAlbum, IMAGE_CODE); } protected void onActivityResult(int requestCode, int resultCode, Intent data) {
Bitmap bm = null; ContentResolver resolver = getContentResolver(); if (requestCode == IMAGE_CODE) { try {
Uri originalUri = data.getData(); bm = MediaStore.Images.Media.getBitmap(resolver, originalUri); imgShow.setImageBitmap(bm); } catch (IOException e) {
e.printStackTrace(); }
}
}
}
layout:activity_main.xml:
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <Button android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="選擇照相" android:layout_marginRight="190dp" android:layout_marginTop="8dp" android:paddingBottom="2dp" android:background="#aabbcc" /> <ImageView android:id="@+id/imgShow" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_margin="15dip" /></LinearLayout>
C. Android studio中XML文件調用圖片,這樣有什麼問題格式嗎 還有就是Android
1.在drawable/pic2前面添加@,引用drawable-xhdpi,drawable-mdpi等文件夾下圖片的格式是:@drawable/name_pic,同理引用其他xml文件的格式也是:@string/name_str,@dimen/name_dimen,@anim/name_anim,@array/name_array等
D. Android開發中,如何在靜態類中使用getResources()獲取圖片資源.
獲取resource需要context對象,所以你這個問題有如下幾個解決思路
1,使用Context作為參數,例如public
static
getResourcesStatic(Context
context,
int
resId)
2,使用Context作為成員變數,在構造函數中接受一個Context參數,並賦值給自己成員變數
這樣在此對象生命期內,都可以使用.
不過並不推薦這種做法,因為傳入的Context多數情況下是Activity,往往會附著很多資源,如背景圖片等,無法GC,導致過高的內存佔用.可以用下面的改進方式:
3,使用WeakReference
保存context的弱引用
使用時要注意判斷ref.get()是否為null