版权声明:本文为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;@Overrideprotected 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() {@Overridepublic 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