您当前的位置:首页 > 养生 > 内容

android drawable(Android Bitmap 与 Drawable之间的区别和转换)

本文目录

  • Android Bitmap 与 Drawable之间的区别和转换
  • Android为什么我手机里没有drawable-mdpi,只有drawable-mdpi 我想换个图片怎么办
  • android中常见的Drawable资源有哪些
  • android:drawable=“@*android:drawable/XXXXX“中的*是什么意思
  • android获取drawable里面的图片的id和名字的方法
  • android 如何向drawable导入图片
  • android是根据什么去选择三种drawable文件夹下的图片
  • Android中drawableStart和drawableLeft的区别
  • android关于几个drawable文件夹的区别
  • android 怎么裁剪drawable

Android Bitmap 与 Drawable之间的区别和转换

 Android bitmap和drawable的区别和转换如下:

1.bitmap 转换 drawable

 Bitmap bitmap = new Bitmap(...); Drawable drawable = new BitmapDrawable(bitmap); //Drawable drawable = new FastBitmapDrawable(bitmap);

2.Drawable to BitmapBitmapDrawable, FastBitmapDrawable直接用getBitmap b. 其他类型的Drawable用Canvas画到一个bitmap上 

 Canvas canvas = new Canvas(bitmap)     drawable.draw(canvas); Drawable d = ImagesList.get(0); Bitmap bitmap =  ((BitmapDrawable)d).getBitmap();

区别如下:

 1.Bitmap - 称作位图,一般位图的文件格式后缀为bmp,当然编码器也有很多如RGB565、RGB888。作为一种逐像素的显示对象执行效率高,但是缺点也很明显存储效率低。

 2.Drawable - 作为Android平下通用的图形对象,它可以装载常用格式的图像,比如GIF、PNG、JPG,当然也支持BMP,当然还提供一些高级的可视化对象,比如渐变、图形等。

另外还有如下相类似的格式:

    Canvas - 名为画布,可以看作是一种处理过程,使用各种方法来管理Bitmap、GL或者Path路径,同时它可以配合Matrix矩阵类给图像做旋转、缩放等操作,同时Canvas类还提供了裁剪、选取等操作。

    Paint - 可以把它看做一个画图工具,比如画笔、画刷。管理了每个画图工具的字体、颜色、样式。

Android为什么我手机里没有drawable-mdpi,只有drawable-mdpi 我想换个图片怎么办

有人肯定会对于android中放置图片的地方drawable—hdpi、drawable—mdpi、drawable—ldpi这三个感到好奇。肯定心里会想,放在哪一个都行,只要是在android中的res目录下的drawable中就行,系统会自己找到。有心的朋友肯定会他把弄个究竟。我以前对drawable—hdpi、drawable—mdpi、drawable—ldpi这三个也了解了一下,但是只是字面上的,没有真正理解透彻,到今天我才算有稍深点的理解。drawable—hdpi看他的单词名肯定知道他是放置高分辨率的图片,drawable—mdpi放置中等分辨率的图片,drawable—ldpi放置低分辨率的图片。大部分人都把的图片放在drawable—mdpi中。起初我认为随便将图片放置在三个当中的任意一个都行,但是今天我知道了。在分辨率低于480*800时把图片放在drawable—mdpi中是不会有什么影响,但是当分辨率为420*800或高于它时就会出问题了。你的手机屏幕有那么大但是他会将图片拉伸,当加载图片后让你感觉该屏幕没有实际的大小,而如果将图片放到drawable—hdpi中则该问题就不会存在了。

android中常见的Drawable资源有哪些

drawable资源共有10种,包括Bitmap文件、Nine-Path文件、Layer List、State List、Level list、Transition Drawable、Inset Drawable、Clip Drawable、Scale Drawable、Shape Drawable

android:drawable=“@*android:drawable/XXXXX“中的*是什么意思

一.@代表引用资源1.引用自定义资源。格式:@[package:]type/nameandroid:text=“@string/hello“ 2.引用系统资源。格式:@android:type/name android:textColor=“@android:color/opaque_red“ 注意:其实@android:type/name是@[package:]type/name 的一个子类二.@*代表引用系统的非public资源。格式:@*android:type/name 系统资源定义分public和非public。public的声明在: 《sdk_path》\platforms\android-8\data\res\values\public.xml @*android:type/name:可以调用系统定义的所有资源 @android:type/name:只能够调用publi属性的资源。 注意:没在public.xml中声明的资源是google不推荐使用的。三.?代表引用主题属性 另外一种资源值允许你引用当前主题中的属性的值。这个属性值只能在style资源和XML属性中使用;它允许你通过将它们改变为当前主题提供的标准变化来改变UI元素的外观,而不是提供具体的值。例如: android:textColor=“?android:textDisabledColor“ 注意,这和资源引用非常类似,除了我们使用一个“?“前缀代替了“@“。当你使用这个标记时,你就提供了属性资源的名称,它将会在主题中被查找,所以你不需要显示声明这个类型(如果声明,其形式就是?android:attr/android:textDisabledColor)。除了使用这个资源的标识符来查询主题中的值代替原始的资源,其命名语法和“@“形式一致:?[namespace:]type/name,这里类型可选。 四.@+代表在创建或引用资源 。格式:@+type/name 含义:”+”表示在R.java中名为type的内部类中添加一条记录。如“@+id/button“的含义是在R.java 文件中的id 这个静态内部类添加一条常量名为button。该常量就是该资源的标识符。如果标示符(包括系统资源)已经存在则表示引用该标示符。最常用的就是在定义资源ID中,例如: @+id/资源ID名 新建一个资源ID @id/资源ID名 应用现有已定义的资源ID,包括系统ID @android:id/资源ID名 引用系统ID,其等效于@id/资源ID名 android:id=“@+id/selectdlg“ android:id=“@android:id/text1“ android:id=“@id/button3“

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.xxx2)你的问题涉及到id和名字,名字是你把图片放到目录时自己起的,命名要符合规范。而id则是由系统自动帮你生成,且是固定格式:R.drawable.xxx

android 如何向drawable导入图片

通过Context的getResource().getDrawable(R.drawable.xxx)即可。一个Drawable资源是绘图中的一个普通概念,可以再屏幕上绘制出来。可以通过APIs中的getDrawable(int)方法检索出来,也可以在其他的XML资源中通过android:drawable和android:icon等属性使用它。Android中有多种不同类型的drawable。Bitmap File:一个位图文件(.png,.jpg,或.gif), 生成一个BitmapDrawable对象.Nine-Patch File:就是一张可以基于自动适应内容大小而伸缩区域的png图片(.9.png), 生成一个NinePatchDrawable对象Layer List:这个Drawable用来管理一个其它多个drawable的数组.既然是一个数组,所以就不难理解索引值最大的元素将画在最高部. 生成一个 LayerDrawable对象.State List:这是一个xml文件用于不同的状态来引用不同的位图图形(比如,当一个Button控件按下状态要显示不同的图像).生成一个StateListDrawable对象.Level List:一个xml文件,定义了一个drawable可用于管理几个可以替换的drawable.每一个都会分配一个最大的数值.生成一个LevelListDrawable.Transition Drawable:一个xml文件,定义了一个drawable可用于两张图片形成一个渐变的过渡效果生成一个TransitionDrawable对象Inset Drawable:一个xml文件,定义了一个drawable,跟据指定的距离插入到另一个drawable.当一个View《视图》对象需要一张比其实际边框要小的背景图时,就可以用到这个了.Clip Drawable:一个xml文件,定义了一个drawable, 根据当前对准值作相应的拉伸处理,生成 ClipDrawable对象.Scale Drawable:一个xml文件,定义了一个drawable, 根据当前对准值作相应的平铺处理,生成 ScaleDrawable对象.Shape Drawable:就是通过一个xml文件来定义一个包含颜色和渐变的几何图形, 生成一个 ShapeDrawable对象AnimationDrawable:还可以创建一个AnimationDrawable对像.Color Drawable:在xml中一个color resource《颜色资源》也可以作为一个drawable. 例如,创建一个state list drawable时,可以为android:drawable属性引用一个颜色资源(android:drawable=“@color/green“)

android是根据什么去选择三种drawable文件夹下的图片

是根据drawable文件夹的修饰符进行选择的。

比如drawable、drawable-ldpi、drawable-mdpi、drawable-hdpi、drawable-xhdpi、drawalbe-xxhdpi、drawable-xxxhdpi

根据修饰符进行优先匹配。

不同的dpi修饰符对应的dpi如下

drawable-ldpi          120DPI

drawable-mdpi        160DPI

drawable-hdpi         240DPI

drawable-xhdpi       320DPI

drawalbe-xxhdpi     480DPI

drawable-xxxhdpi    640DPI

dpi是根据手机的当前分辨率ppi归一化得到的。

那么PPI如何得来的?

如果手机的宽为X,高为Y,屏幕大小为Z英寸,那么

公式中的X2其实是X的平方,即X*X。

比如三星手机I9260分辨率是1280*720,屏幕大小是4.65英寸,那么计算得到的PPI就是315.8PPI

找一个最近的DPI值应该是320DPI,也就是这个设备被归一化后就是320DPI。属于xhdpi。

系统取图片时会优先选择drawable-xhdpi里面的图片,如果drawable-xhdpi不存在或者没有这张图,就会就近从其它分辨率和默认的无后缀drawable文件夹下取。

比如工程只有在draw-xxhdpi文件下有img图片,而你的设置是xhdpi,就会从xxhdpi取完图片再压缩到对应大小返回给使用者。

Android中drawableStart和drawableLeft的区别

drawableLeft就是指左边drawableStart指文字阅读开始的方向,也就是我们阅读的方向,在大部分国家是自左向右的阅读方式,此时drawableStart就相当于drawableLeft,但有些文化,像阿拉伯等是从右到左的,此时就相当于drawableRight,不只这个属性,其他方向性属性都有start和end,如marginLeft,layout_toStartOf,layout_alignStart等等Android 从4.2开始引入了由右到左文字的全面本地支持布局。在本地RTL支持下,可以为所有用户带来完美的应用体验,不论他们的文字书写方向是由左至右还是由右至左。当用户切换系统语言到由右至左书写方式时,系统提供自动的应用UI布局和所有可视组件的镜像,包括文字元素的显示和输入。应用仅需极少改变即可支持RTL布局镜像。如果应用支持这一特性,只要在应用的manifest文件中将所有的”left/right”布局属性改变为对应的”start/end”即可。系统就会根据需要处理UI

android关于几个drawable文件夹的区别

mdpi、hdpi、xdpi、xxdpi其实之前还有个ldpi,但是随着移动设备配置的不断升级,这个像素密度的设备已经很罕见了,所在现在适配时不需考虑。mdpi、hdpi、xdpi、xxdpi用来修饰Android中的drawable文件夹及values文件夹,用来区分不同像素密度下的图片和dimen值。那么如何区分呢?Google官方指定按照下列标准进行区分:名称像素密度范围mdpi 120dpi~160dpi hdpi 160dpi~240dpi xhdpi 240dpi~320dpi xxhdpi 320dpi~480dpi xxxhdpi 480dpi~640dpi 在进行开发的时候,我们需要把合适大小的图片放在合适的文件夹里面。下面以图标设计为例进行介绍。在设计图标时,对于五种主流的像素密度(MDPI、HDPI、XHDPI、XXHDPI 和 XXXHDPI)应按照 2:3:4:6:8 的比例进行缩放。例如,一个启动图标的尺寸为48x48 dp,这表示在 MDPI 的屏幕上其实际尺寸应为 48x48 px,在 HDPI 的屏幕上其实际大小是 MDPI 的 1.5 倍 (72x72 px),在 XDPI 的屏幕上其实际大小是 MDPI 的 2 倍 (96x96 px),依此类推。虽然 Android 也支持低像素密度 (LDPI) 的屏幕,但无需为此费神,系统会自动将 HDPI 尺寸的图标缩小到 1/2 进行匹配。下图为图标的各个屏幕密度的对应尺寸屏幕密度图标尺寸mdpi 48x48px hdpi 72x72px xhdpi 96x96px xxhdpi 144x144px xxxhdpi 192x192px

android 怎么裁剪drawable

图片裁剪 package com.xiaoma.piccut.demo; import java.io.File; import android.app.Activity; import android.app.AlertDialog; import android.content.DialogInterface; import android.content.Intent; import android.graphics.Bitmap; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; import android.net.Uri; import android.os.Bundle; import android.os.Environment; import android.provider.MediaStore; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.ImageButton; import android.widget.ImageView; /** * @Title: PicCutDemoActivity.java * @Package com.xiaoma.piccut.demo * @Description: 图片裁剪功能测试 * @author XiaoMa */ public class PicCutDemoActivity extends Activity implements OnClickListener { private ImageButton ib = null; private ImageView iv = null; private Button btn = null; private String tp = null; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); //初始化 init(); } /** * 初始化方法实现 */ private void init() { ib = (ImageButton) findViewById(R.id.imageButton1); iv = (ImageView) findViewById(R.id.imageView1); btn = (Button) findViewById(R.id.button1); ib.setOnClickListener(this); iv.setOnClickListener(this); btn.setOnClickListener(this); } /** * 控件点击事件实现 * * 因为有朋友问不同控件的背景图裁剪怎么实现, * 我就在这个地方用了三个控件,只为了自己记录学习 * 大家觉得没用的可以跳过啦 */ @Override public void onClick(View v) { switch (v.getId()) { case R.id.imageButton1: ShowPickDialog(); break; case R.id.imageView1: ShowPickDialog(); break; case R.id.button1: ShowPickDialog(); break; default: break; } } /** * 选择提示对话框 */ private void ShowPickDialog() { new AlertDialog.Builder(this) .setTitle(“设置头像...“) .setNegativeButton(“相册“, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); /** * 刚开始,我自己也不知道ACTION_PICK是干嘛的,后来直接看Intent源码, * 可以发现里面很多东西,Intent是个很强大的东西,大家一定仔细阅读下 */ Intent intent = new Intent(Intent.ACTION_PICK, null); /** * 下面这句话,与其它方式写是一样的效果,如果: * intent.setData(MediaStore.Images.Media.EXTERNAL_CONTENT_URI); * intent.setType(““image/*“);设置数据类型 * 如果朋友们要限制上传到服务器的图片类型时可以直接写如:“image/jpeg 、 image/png等的类型“ * 这个地方小马有个疑问,希望高手解答下:就是这个数据URI与类型为什么要分两种形式来写呀?有什么区别? */ intent.setDataAndType( MediaStore.Images.Media.EXTERNAL_CONTENT_URI, “image/*“); startActivityForResult(intent, 1); } }) .setPositiveButton(“拍照“, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { dialog.dismiss(); /** * 下面这句还是老样子,调用快速拍照功能,至于为什么叫快速拍照,大家可以参考如下官方 * 文档,you_sdk_path/docs/guide/topics/media/camera.html * 我刚看的时候因为太长就认真看,其实是错的,这个里面有用的太多了,所以大家不要认为 * 官方文档太长了就不看了,其实是错的,这个地方小马也错了,必须改正 */ Intent intent = new Intent( MediaStore.ACTION_IMAGE_CAPTURE); //下面这句指定调用相机拍照后的照片存储的路径 intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri .fromFile(new File(Environment .getExternalStorageDirectory(), “xiaoma.jpg“))); startActivityForResult(intent, 2); } }).show(); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { switch (requestCode) { // 如果是直接从相册获取 case 1: startPhotoZoom(data.getData()); break; // 如果是调用相机拍照时 case 2: File temp = new File(Environment.getExternalStorageDirectory() + “/xiaoma.jpg“); startPhotoZoom(Uri.fromFile(temp)); break; // 取得裁剪后的图片 case 3: /** * 非空判断大家一定要验证,如果不验证的话, * 在剪裁之后如果发现不满意,要重新裁剪,丢弃 * 当前功能时,会报NullException,小马只 * 在这个地方加下,大家可以根据不同情况在合适的 * 地方做判断处理类似情况 * */ if(data != null){ setPicToView(data); } break; default: break; } super.onActivityResult(requestCode, resultCode, data); } /** * 裁剪图片方法实现 * @param uri */ public void startPhotoZoom(Uri uri) { /* * 至于下面这个Intent的ACTION是怎么知道的,大家可以看下自己路径下的如下网页 * yourself_sdk_path/docs/reference/android/content/Intent.html * 直接在里面Ctrl+F搜:CROP ,之前小马没仔细看过,其实安卓系统早已经有自带图片裁剪功能, * 是直接调本地库的,小马不懂C C++ 这个不做详细了解去了,有轮子就用轮子,不再研究轮子是怎么 * 制做的了...吼吼 */ Intent intent = new Intent(“com.android.camera.action.CROP“); intent.setDataAndType(uri, “image/*“); //下面这个crop=true是设置在开启的Intent中设置显示的VIEW可裁剪 intent.putExtra(“crop“, “true“); // aspectX aspectY 是宽高的比例 intent.putExtra(“aspectX“, 1); intent.putExtra(“aspectY“, 1); // outputX outputY 是裁剪图片宽高 intent.putExtra(“outputX“, 150); intent.putExtra(“outputY“, 150); intent.putExtra(“return-data“, true); startActivityForResult(intent, 3); } /** * 保存裁剪之后的图片数据 * @param picdata */ private void setPicToView(Intent picdata) { Bundle extras = picdata.getExtras(); if (extras != null) { Bitmap photo = extras.getParcelable(“data“); Drawable drawable = new BitmapDrawable(photo); /** * 下面注释的方法是将裁剪之后的图片以Base64Coder的字符方式上 * 传到服务器,QQ头像上传采用的方法跟这个类似 */ /*ByteArrayOutputStream stream = new ByteArrayOutputStream(); photo.compress(Bitmap.CompressFormat.JPEG, 60, stream); byte b = stream.toByteArray(); // 将图片流以字符串形式存储下来 tp = new String(Base64Coder.encodeLines(b)); 这个地方大家可以写下给服务器上传图片的实现,直接把tp直接上传就可以了, 服务器处理的方法是服务器那边的事了,吼吼 如果下载到的服务器的数据还是以Base64Coder的形式的话,可以用以下方式转换 为我们可以用的图片类型就OK啦...吼吼 Bitmap dBitmap = BitmapFactory.decodeFile(tp); Drawable drawable = new BitmapDrawable(dBitmap); */ ib.setBackgroundDrawable(drawable); iv.setBackgroundDrawable(drawable); } } }


声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,谢谢。

上一篇: 移位运算实验(如何用单片机做流水灯)

下一篇: 抗癌中药第一名是什么,抗癌食物排行榜第一名竟然是它(青蒿素16个小时可杀死癌细胞)



猜你感兴趣

推荐阅读

网站内容来自网络,如有侵权请联系我们,立即删除! | 软文发布 | 粤ICP备2021106084号