
你好,看样子你可能是刚接触Android不久,我先就你想实现的问题给你解答。你问题的本质是要在ImageView上展示,你需要理解以下几点:
1、ImageView这个组件可以直接设置Bitmap和Drawable来展示,方法分别是setImageBitmap()和setImageDrawable()
2、根据(1)我们需要使用Drawable,Drawable可以由drawable目录里的资源生成,在这之前你需要理解一个概念,我们向drawable目录放入一张是需要命名的,比如名为sunpng,系统会帮助我们自动生成这个的id,如果想在java代码中引用这个就需要使用这个id,使用方式:Rdrawablesun。
3、使用系统方法将转换为Drawable。
Drawable drawable = getResources()getDrawable(Rdrawablesun);
imageViewsetImageDrawable(drawable);
这样就可以将显示到ImageView上。
这里面使用的getResources()方法获取的Resources对象可以帮助我们获取很多资源文件,这个方法可以直接在Activity里使用,在其他地方需要使用Context对象调用。此外,Resources的getDrawable方法已被标记为过时,系统推荐使用两个参数的方法。getDrawable(int id, Theme theme),我们不需要设置Theme可以给null。
4、题外话
1)现在资源已经很少放在drawable目录里,而是放在mipmap目录,引用方式Rmipmapxxx
2)你的问题涉及到id和名字,名字是你把放到目录时自己起的,命名要符合规范。而id则是由系统自动帮你生成,且是固定格式:Rdrawablexxx
方式:以R文件的方式
路径:假设 res/drawable下有 testjpg文件
Bitmap bitmap=BitmapFactorydecodeResource(thisgetContext()getResources(), Rdrawabletest)
三种方式:
现总结以下几种读取Bitmap的方法:
以文件流的方式,假设在sdcard下有 testpng
FileInputStream fis = new FileInputStream("/sdcard/testpng");
Bitmap bitmap = BitmapFactorydecodeStream(fis);
以R文件的方式,假设 res/drawable下有 testjpg文件
Bitmap bitmap = BitmapFactorydecodeResource(thisgetContext()getResources(), Rdrawabletest);
以ResourceStream的方式,但不用到R文件
Bitmapbitmap=BitmapFactorydecodeStream(getClassgetResourceAsStream(“/res/drawable/testpng”)
在Java 直接用BitmapFactorydecodeFile(pathName);就可以读取。
或者用你的方式,BitmapFactorydecodeStream(fosfrom);
SE的学习过程中,我们就接触到了I/O流的概念,并且使用了一些文件输入输出流的API来将数据保存到文件或者是从文件中读取数据。同样,这个手段也适用于Android系统,我们可以在应用开发过程中使用文件相关的API方法。
何谓内部存储呢实际上就是指将程序的私有数据以文件的形式存储在Android设备的内存中。同理,如果是存放在SD卡等地方,就称之为外部存储。
我们在,你需要建立文件的输入输出流,并在流中 *** 作数据。
首先是写文件。
为了使用内部存储向文件中写入一些数据,你可以调用openFileOutput()方法,需要的参数为文件名和写入模式。写入模式实际上就是该文件的权限归属,可以是公有的,也可以是私有的。如何具体地创建一个文件输出流呢,具体方式如下:
FileOutputStream fileOut =
openFileOutput("file_name",MODE_WORLD_READABLE);
//第一个参数即文件名,第二个参数表示文件存储的模式
对于第二个参数,需要补充的是:文件存储的模式公有四种:
MODE_PRIVATE:该模式是默认的,通过该模式创建的文件是私有的,即只能被应用本身访问。注意:在该模式下写入的内容会覆盖原有的内容。
MODE_APPEND:与上个模式类似,但在写入内容时会检查待创建的文件是否存在。若文件已被创建,则往该文件中追加内容,而不是覆盖原来的内容;若文件未被创建,则创建新的文件。
MODE_WORLD_READABLE:表示当前创建的这个文件允许被其他应用读取。
MODE_WORLD_WRITEABLE:表示当前创建的这个文件允许被其他应用写入。
默认情况下,不仅是应用创建的文件,包括Shared
Preferences和数据库,都是私有的。那么问题来了,如果希望其他应用既能读又能写,应该怎么办呢参考下面这种用法:
FileOutputStream fileOut = openFileOutput("file_name",MODE_WORLD_READABLE +
MODE_WORLD_WRITEABLE);
而对于openFileOutput()方法,它返回的是一个FileOutputStream实例。换言之,你通过文件输出流对象中得到了这个实例,随后你便可以调用写相关的方法来向文件写入数据。具体的用法如下:
String str = "shiyanlou";
//待写入的数据
fOutwrite(strgetBytes());
//实际上写入文件的是一个字节数组,我们用gettBytes()方法将其转换成目标格式
fOutclose();
//记得写入完毕后要用close()结束
接下来是读文件。
怎样读取我们刚刚创建的这个文件呢你应该猜到了,是使用openFileInput()方法。该方法需要填入待读取文件的文件名,同样,它返回的是一个FileInputStream的实例。具体用法如下:
FileInputStream fileIn = openFileInput(file);
在打开输入流后,你可以调用read()方法每次从文件中读出一个字符出来,然后装入一个字符串变量中。具体做法如下:
int ch;
String temp="";
while( (ch = finread()) != -1){
temp = temp + CharactertoString((char)ch);
//不断地追加读取的内容
}
//通过一个for循环,你最后得到的temp字符串包含了文件中的所有数据
fileInclose();
//记得要关闭输入流
除了上面我们用到的这些方法(比如write()、read()和close()),FileOutputStream和FileInputStream类中还有很多常用的方法,我们在下面作一简要介绍。
FileOutputStream类中的其它常用方法:
write(byte[] b, int off, int len):该方法从指定的字节数组开始到该文件输出流关闭写入len字节。
getChannel():该方法返回一个只读的、与文件输出流关联的文件通道对象(FileChannel)
getFD():该方法返回与此流有关的文件描述符对象(FileDescriptor)
FileInputStream类中的其它常用方法:
read(byte[] b, int off, int len):该方法从输入流中数据读取最多len个字节到字节数组
getChannel():该方法返回一个只读的、与文件输出流关联的文件通道对象(FileChannel)
getFD():该方法返回与此流有关的文件描述符对象(FileDescriptor)
available():该方法可通过一个方法的调用者从输入流中阻止这个输入流返回可以读取(或跳过)的字节数的估计值。
四、在Android上实现文件读写
下面我们通过一个实例来学习如何将Java中常用的文件读写沿用到Android中去。
实验步骤主要有:
(若你已在第二小节完成,请跳至下一步)使用Android
Studio创建应用项目FileIOPractice,包名为comshiyanlouandroidfileiopractice,基于Android
51制作。同时添加MainActivity及其布局资源文件。
创建并打开AVD模拟器(镜像选择API22:Android 511)。
在res/layout/activity_mainxml资源文件放入一些文本框和按钮。
在MainActivityjava中,初始化要用到的控件,添加文件读写相关的代码。
编译并运行这个应用,等待应用安装至模拟器,在模拟器中使用该应用。
现在你可以按照上述步骤自己完成该实验。下面也给出了本实验涉及到的源代码和资源文件详情,在必要时你可以使用它们。在注释中我们也对一些模块进行了详细的讲解。
以下是MainActivity的布局文件res/layout/activity_mainxml:
xmlns:tools=">
先很负责任的说一下,这个内容也是百度来的,但是很不负责任的是,当初只记录解决方案,忘了记录是查看的哪篇博客了,这里先对不知道借鉴的谁表示感谢。无法分享链接,就厚着脸皮把(转)字去掉了,请大家谅解。
先提供一下 Android知识点——目录 的链接,然后让我们进入正题。
实际上,这篇博客所说的内容并不是所有人都可以用到,毕竟大多数时候,我们只需要展示,而并不需要知道的宽高;有的时候我们只需要知道展示的宽高(即ImageView)的宽高,不需要知道资源的实际尺寸。
但是需求千千万万嘛,以程序员的脑洞,怎么能想到产品的脑洞究竟有多大呢?我这里就遇到了一个需求,那就是需要在一个可缩放的上标注icon(类似地图上的marker)。这还不算完,毕竟在找到的缩放控件 PhotoView 中,我们点击到上后,是有点击点位在整个上的百分比坐标回调的。而多端通过百分比是很容易就能在中获取到相同的点位,并回显出对应的icon的(没办法,谁让我找的是方便计算百分比的呢),结果Web端优先做了这部分功能,使用的是在原图上的具体坐标。这样我百分比的计划自然就落空了,只能想办法计算出具体的点位。
因此获取的原始尺寸就是一个必不可少的环节,我刚刚百度了一下,查到 wangke_king 的 Android获取的宽度和高度 中使用的方法是:
我这里没有亲测过,不过应该是没有问题,但是很遗憾我们的需求是在网络上做测量,所以这个方法也无法使用,不过如果其他有类似本地需求的,不妨尝试一下。而我之前找到的解决方案为:
首先说明,上述的方法是可以实现的尺寸测量的,只是有一个小小的问题,那就是想要计算出Drawable的宽高,需要必须等到加载完成之后,尝试了使用viewpost(),监听组件加载完成,但是并不是每次都能获取到Drawable的宽高,因此当初的解决方案是写了个两秒钟的定时器,每50毫秒测量一次,直到获取到值为止。这样的解决方案可谓是相当无脑了,而且还要消耗很多不必要的资源。
还好皇天不负有心人啊,终于找到了通过Glide获取宽高的方式:
这样我们就可以通过回调,在Glide将网络注入到对应的组件的时候,得到的Bitmap,然后在通过Bitmap来获取的宽高。但是需要注意的一点是,Bitmap的泛型是需要手动去设置的哦。
另外SimpleTarget现在已经过时,暂时还没有查到。我搜索过SimpleTarget过时使用什么替换,有一些说法是使用BitmapImageViewTarget ,不过下面是实际测试结果。
链接:
百度-景色
测量结果:
信息:
如果不是我使用有误的话,BitmapImageViewTarget 是无法替换SimpleTarget ,实现测量原始宽高的功能的。
先找到这个控件,把drawble转换成bitmap,然后获取bitmap的宽高即可。主要代码如下:
Bitmap bitmap = BitmapFactorydecodeResource(thisgetResources(), RidXXX);
int height = bitmapgetHeight();
int width= bitmapgetWidth();
APK程序其实是个ZIP压缩包,想提取其中的资源就得先用解压缩软件将其打开,在APK安装包上右键、打开方式、选择压缩软件打开,如果以前没有用压缩软件打开过APK文件,可以点击选择默认程序然后找到解压缩软件进行打开。
用解压缩软件打开APK程序后,一般APK程序的资源都在“res”文件中。
是有形式的事物,是图画、照片、拓片等的统称。图是技术制图中的基础术语,指用点、线、符号、文字和数字等描绘事物几何特征、形态、位置及大小的一种形式。随着数字采集技术和信号处理理论的发展,越来越多的以数字形式存储。
以上就是关于android获取drawable里面的图片的id和名字的方法全部的内容,包括:android获取drawable里面的图片的id和名字的方法、android,如何读取资源文件里的图片到bitmap里、android怎么用流 读取云端图片等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)