日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android中如何查看在res中存放的drawable文件对应的JAVA类型是什么呢

發布時間:2024/7/5 Android 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android中如何查看在res中存放的drawable文件对应的JAVA类型是什么呢 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

有些時候需要將res中的資源文件加載進來然后做一些修改,然后再賦值給控件使用,比如這樣:

Drawable drawable = getResources().getDrawable(int id); 現在我需要把資源文件id所對應的Drawable對象加載進來,然后做向下轉型處理,如果我不調試查看本身的類型的話,該怎么知道它到底是哪種類型呢?我們來通過源代碼查看究竟:

首先我們找到getResources().getDrawable()方法:

public Drawable getDrawable(int id) throws NotFoundException {synchronized (mTmpValue) {TypedValue value = mTmpValue;getValue(id, value, true);return loadDrawable(value, id);}}
這個方法并沒有做什么,進入到loadDrawable方法中:

/*package*/ Drawable loadDrawable(TypedValue value, int id)throws NotFoundException {if (TRACE_FOR_PRELOAD) {// Log only framework resourcesif ((id >>> 24) == 0x1) {final String name = getResourceName(id);if (name != null) android.util.Log.d("PreloadDrawable", name);}}final long key = (((long) value.assetCookie) << 32) | value.data;Drawable dr = getCachedDrawable(key);if (dr != null) {return dr;}Drawable.ConstantState cs = sPreloadedDrawables.get(key);if (cs != null) {dr = cs.newDrawable(this);} else {if (value.type >= TypedValue.TYPE_FIRST_COLOR_INT &&value.type <= TypedValue.TYPE_LAST_COLOR_INT) {dr = new ColorDrawable(value.data);}if (dr == null) {if (value.string == null) {throw new NotFoundException("Resource is not a Drawable (color or path): " + value);}String file = value.string.toString();if (DEBUG_LOAD) Log.v(TAG, "Loading drawable for cookie "+ value.assetCookie + ": " + file);if (file.endsWith(".xml")) {try {XmlResourceParser rp = loadXmlResourceParser(file, id, value.assetCookie, "drawable");dr = Drawable.createFromXml(this, rp);rp.close();} catch (Exception e) {NotFoundException rnf = new NotFoundException("File " + file + " from drawable resource ID #0x"+ Integer.toHexString(id));rnf.initCause(e);throw rnf;}} else {try {InputStream is = mAssets.openNonAsset(value.assetCookie, file, AssetManager.ACCESS_STREAMING);// System.out.println("Opened file " + file + ": " + is);dr = Drawable.createFromResourceStream(this, value, is,file, null);is.close();// System.out.println("Created stream: " + dr);} catch (Exception e) {NotFoundException rnf = new NotFoundException("File " + file + " from drawable resource ID #0x"+ Integer.toHexString(id));rnf.initCause(e);throw rnf;}}}}if (dr != null) {dr.setChangingConfigurations(value.changingConfigurations);cs = dr.getConstantState();if (cs != null) {if (mPreloading) {sPreloadedDrawables.put(key, cs);} else {synchronized (mTmpValue) {//Log.i(TAG, "Saving cached drawable @ #" +// Integer.toHexString(key.intValue())// + " in " + this + ": " + cs);mDrawableCache.put(key, new WeakReference<Drawable.ConstantState>(cs));}}}}return dr;}
這一大段我們看主要的:

if (file.endsWith(".xml")) {try {XmlResourceParser rp = loadXmlResourceParser(file, id, value.assetCookie, "drawable");dr = Drawable.createFromXml(this, rp);rp.close();} catch (Exception e) {NotFoundException rnf = new NotFoundException("File " + file + " from drawable resource ID #0x"+ Integer.toHexString(id));rnf.initCause(e);throw rnf;}} 這里以selector說明,selector是定義在xml中的,我們就找到這個地方,它原來是使用XmlResourceParser來對xml資源文件進行解析的,咱們進去createFromXml方法內部一探究竟:

/*** Create a drawable from an XML document. For more information on how to* create resources in XML, see* <a href="{@docRoot}guide/topics/resources/drawable-resource.html">Drawable Resources</a>.*/public static Drawable createFromXml(Resources r, XmlPullParser parser)throws XmlPullParserException, IOException {AttributeSet attrs = Xml.asAttributeSet(parser);int type;while ((type=parser.next()) != XmlPullParser.START_TAG &&type != XmlPullParser.END_DOCUMENT) {// Empty loop}if (type != XmlPullParser.START_TAG) {throw new XmlPullParserException("No start tag found");}Drawable drawable = createFromXmlInner(r, parser, attrs);if (drawable == null) {throw new RuntimeException("Unknown initial tag: " + parser.getName());}return drawable;}從這段代碼中我們可以發現,最主要的工作是由方法createFromXmlInner來完成的,我們進去看看:

/*** Create from inside an XML document. Called on a parser positioned at* a tag in an XML document, tries to create a Drawable from that tag.* Returns null if the tag is not a valid drawable.*/public static Drawable createFromXmlInner(Resources r, XmlPullParser parser, AttributeSet attrs)throws XmlPullParserException, IOException {Drawable drawable;final String name = parser.getName();if (name.equals("selector")) {drawable = new StateListDrawable();} else if (name.equals("level-list")) {drawable = new LevelListDrawable();} else if (name.equals("layer-list")) {drawable = new LayerDrawable();} else if (name.equals("transition")) {drawable = new TransitionDrawable();} else if (name.equals("color")) {drawable = new ColorDrawable();} else if (name.equals("shape")) {drawable = new GradientDrawable();} else if (name.equals("scale")) {drawable = new ScaleDrawable();} else if (name.equals("clip")) {drawable = new ClipDrawable();} else if (name.equals("rotate")) {drawable = new RotateDrawable();} else if (name.equals("animated-rotate")) {drawable = new AnimatedRotateDrawable(); } else if (name.equals("animation-list")) {drawable = new AnimationDrawable();} else if (name.equals("inset")) {drawable = new InsetDrawable();} else if (name.equals("bitmap")) {drawable = new BitmapDrawable();if (r != null) {((BitmapDrawable) drawable).setTargetDensity(r.getDisplayMetrics());}} else if (name.equals("nine-patch")) {drawable = new NinePatchDrawable();if (r != null) {((NinePatchDrawable) drawable).setTargetDensity(r.getDisplayMetrics());}} else {throw new XmlPullParserException(parser.getPositionDescription() +": invalid drawable tag " + name);}drawable.inflate(r, parser, attrs);return drawable;}噢噢,原來是這樣啊,我定義什么樣類型的圖片,最后就有什么樣的Java類型與之對應,原來我的selector對應StateListDrawable,恍然大悟,接下來就容易處理了。

總結

以上是生活随笔為你收集整理的Android中如何查看在res中存放的drawable文件对应的JAVA类型是什么呢的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 操色网 | 曰本三级日本三级日本三级 | 影音先锋男人的天堂 | 朋友人妻少妇精品系列 | 亚洲经典视频 | 91精品免费在线观看 | 日韩亚洲欧美中文字幕 | 精品自拍视频在线观看 | 在线观看黄色av网站 | 日本69少妇| 久草手机在线观看 | 四虎影视在线 | 五级毛片 | 高清中文字幕mv的电影 | 国产精品v欧美精品v日韩精品 | 日本中文字幕在线观看视频 | 91看片视频 | 国产综合久久久久 | av动漫在线免费观看 | 日毛片| 亚洲一级二级 | 99久久久成人国产精品 | 狠狠干天天干 | 国产精品一区二区久久国产 | 日本91av | 影音先锋每日资源 | 亚洲精品久久视频 | 91精品国产乱码久久久久 | 18岁成年人网站 | 国产精品久久久久久久久久小说 | 色小说综合 | 亚洲性一区 | 欧美人妻一区二区三区 | 91免费国产 | 国产日韩一区二区三免费高清 | 91麻豆精品国产91 | 79日本xxxxxxxxx18 婷婷亚洲一区 | 久久精品久久99 | 久草网在线视频 | 中文字幕精品一区二区三区视频 | 国产高清视频免费在线观看 | 综合久久五月天 | 国产在线中文 | 日产欧产va高清 | 日本一区二区在线免费 | 高潮爽爆喷水h | 精品国产成人av在线免 | 免费插插视频 | 午夜影视av| 国产精品美女久久久久 | 一本色道久久综合亚洲精品酒店 | 天天操免费视频 | 欧美色图在线视频 | av自拍| 婷婷狠狠操 | 午夜精品成人毛片非洲 | 久久久精品视 | 中国av免费看 | 欧美成人三级在线播放 | 日本三级久久久 | 欧美区国产区 | 免费特级黄毛片 | 国产视频xxx| 亚洲天堂2015 | 国产精品入口夜色视频大尺度 | 欧美黄色短视频 | 超碰精品在线观看 | 潘金莲裸体一级淫片视频 | 国产精品亚洲视频 | 日本在线不卡一区二区三区 | 日本中文字幕免费 | 亚洲综合一 | 久久精品人妻一区二区 | 96超碰在线 | 撕开少妇裙子猛然进入 | 三级黄网站 | 伊人婷婷在线 | 亚洲国产99| 热久久最新网址 | 国产女人被狂躁到高潮小说 | 男女做那个的全过程 | 91久久一区二区 | 黄色三级在线 | 欧美一级做a爰片久久高潮 久热国产精品视频 | 一级黄色录相 | 可以免费看毛片的网站 | 男性裸体全身精光gay | 美女扒开腿让男生桶 | 亚洲五月婷婷 | 国产精品久草 | 黄网站在线观 | 日韩精品一区二区三区国语自制 | 亚洲av无码一区二区三区在线 | 毛片88| 黄色片的网站 | 国产97色| ass精品国模裸体欣赏pics | 日韩久久中文字幕 | 国产精品s色 |