ResDrawableImgUtil【根據圖片名稱獲取resID值或者Bitmap對象】


版權聲明:本文為HaiyuKing原創文章,轉載請注明出處!

前言

根據圖片名稱獲取項目的res/drawable-xxdhpi中相應資源的ID值以及bitmap值的封裝類。

效果圖

代碼分析

根據圖片名稱獲取圖片的resID值有兩個方案,選其一即可。

使用步驟

一、項目組織結構圖

注意事項:

1、導入類文件后需要change包名以及重新import R文件路徑

2、Values目錄下的文件(strings.xml、dimens.xml、colors.xml等),如果項目中存在,則復制里面的內容,不要整個覆蓋

二、導入步驟

將ResDrawableImgUtil.java復制到項目中即可。

package com.why.project.resdrawableimgutildemo.util;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.drawable.Drawable;
import android.support.v4.content.ContextCompat;

import com.why.project.resdrawableimgutildemo.R;

import java.lang.reflect.Field;

/**
 * @Created HaiyuKing
 * @Used  根據圖片名稱獲取resID值或者Bitmap對象
 * @參考資料 http://topmanopensource.iteye.com/blog/1600321
 * http://blog.csdn.net/wuzhipeng1991/article/details/17374561
 */
public class ResDrawableImgUtil {

    public final static String FILE_EXTENSION_SEPARATOR = ".";//文件擴展名分割器

    /**
     * 根據圖片名稱獲取圖片的resID值(方案一)
     * @param imgName 圖片名稱*/
    public static int getResourceIdByIdentifier(Context context, String imgName){

        //判斷imgName是否含有后綴
        int extenPosi = imgName.lastIndexOf(FILE_EXTENSION_SEPARATOR);
        if(extenPosi != -1){
            imgName = imgName.substring(0, extenPosi);
        }

        int imgResourceId = -1;
        imgResourceId = context.getResources().getIdentifier(imgName, "drawable" , context.getPackageName());

        return imgResourceId;
    }

    /**
     * 根據圖片名稱獲取圖片的resID值(方案二)
     * @param imgName 圖片名稱*/
    public static int getResourceIdByReflect(String imgName){

        //判斷imgName是否含有后綴
        int extenPosi = imgName.lastIndexOf(FILE_EXTENSION_SEPARATOR);
        if(extenPosi != -1){
            imgName = imgName.substring(0, extenPosi);
        }

        int imgResourceId = -1;
        Class drawable = R.drawable.class;
        Field field = null;
        try {
            field = drawable.getField(imgName);
            imgResourceId = field.getInt(field.getName());
        } catch (Exception e) {
        }
        return imgResourceId;
    }

    /**
     * 根據圖片的resID值獲取圖片名稱
     * @param imgResId 圖片的resID值*/
    public static String getResourceName(Context context,int imgResId){
        String imgName = "";
        imgName = context.getResources().getResourceName(imgResId);

        return imgName;
    }

    /**
     * 根據圖片名稱獲取圖片的Drawable
     * @param imgName 圖片名稱*/
    public static Drawable getDrawableByImgName(Context context, String imgName){
        //int imgResourceId = R.drawable.ic_launcher;//Eclipse寫法
        int imgResourceId = R.mipmap.ic_launcher;//Android Studio寫法
        imgResourceId = getResourceIdByIdentifier(context,imgName);
        //解析資源文件夾下,id為resID的圖片
        return ContextCompat.getDrawable(context,imgResourceId);
    }

    /**
     * 根據圖片名稱獲取圖片的Bitmap
     * @param imgName 圖片名稱*/
    public static Bitmap getBitmapByImgName(Context context, String imgName){
        //int imgResourceId = R.drawable.ic_launcher;//Eclipse寫法
        int imgResourceId = R.mipmap.ic_launcher;//Android Studio寫法
        imgResourceId = getResourceIdByIdentifier(context,imgName);
        //解析資源文件夾下,id為resID的圖片
        return BitmapFactory.decodeResource(context.getResources(),imgResourceId);
    }

}

注意:黃色標記的地方,分別為Eclipse何Android studio兩個開發環境下的寫法。

三、使用方法

package com.why.project.resdrawableimgutildemo;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;

import com.why.project.resdrawableimgutildemo.util.ResDrawableImgUtil;

public class MainActivity extends AppCompatActivity {

    private Button btn_getId;
    private TextView tv_show;
    private ImageView img_show;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        initViews();
        initEvents();
    }

    private void initViews() {
        btn_getId = (Button) findViewById(R.id.btn_getId);
        tv_show = (TextView) findViewById(R.id.tv_show);
        img_show = (ImageView) findViewById(R.id.img_show);
    }

    private void initEvents() {
        btn_getId.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String imgName = "icon.png"; int resId = ResDrawableImgUtil.getResourceIdByIdentifier(MainActivity.this,imgName);
                tv_show.setText(tv_show.getText().toString() + resId);

                if(resId != -1){
                    img_show.setBackgroundResource(resId);
                }
            }
        });
    }


}

混淆配置

參考資料

Android根據圖片文件名獲取它的資源ID 的兩種方式

Android中,根據圖片名稱獲取res文件夾中的圖片

項目demo下載地址

https://github.com/haiyuKing/ResDrawableImgUtilDemo


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM