精华内容
参与话题
问答
  • Drawable

    2018-09-14 13:42:08
    Drawable表示的是一种可以在Canvas上进行绘制的抽象的概念。 Drawable的优点: 使用简单,比自定义View的成本要低 非图片类型的Drawable占用空间较小,利于减少apk的大小 1.简介 Drawable有很多种,表示一种...

    Drawable表示的是一种可以在Canvas上进行绘制的抽象的概念。

    Drawable的优点:

    1. 使用简单,比自定义View的成本要低
    2. 非图片类型的Drawable占用空间较小,利于减少apk的大小

    1.简介

    Drawable有很多种,表示一种图像的概念。

    Drawable是一个抽象类,它是所有Drawable的基类。

    Drawable的内部宽高参数比较重要,获取方法:getIntrinsicWidth() , getIntrinsicHeight()

    并不是所有的Drawable都有内部的宽高;对于一张图片所形成的Drawable,它的内部宽高就是图片的宽高。

    2.分类

    • BitmapDrawable
      表示一张图片 , 在xml种定义使用标签
      属性: antialias 图片抗锯齿 ; dither 抖动效果(让高质量的照片在低质量的屏幕上显示较好的效果) ; filter 过滤 ; tileMode 平铺模式 [ repeat , mirror , clamp]
    • NinePatchDrawable
      .9格式图片
    • ShapeDrawable
      属性: shape [rectangle , oval , line , ring] ; corners 四个角的角度 ; gradient 渐变 angle角度 0 : 从左到右 , 必须是45的倍数 , 90从上到下 , type : 渐变的效果 [linear , radial , sweep]; solid 填充 ; stroke 描边
    • LayerDrawable
      表示一种层次化的Drawable集合
    • StateListDrawable
      Selector,可根据不同的状态来设置不同的样式
    • LevelListDrawable
      表示一个Drawable集合,集合中的每个Drawable都有一个等级概念,根据不同的等级会切换为对应的Drawable。
      通过minLevel , maxLevel来设置最小最大等级,在此之间会显示该Drawable。可以通过Drawable的setLevel来切换Drawable , 也可以通过ImageView的setImageLevel来切换Drawable。Drawable等级0~10k
    • TransitionDrawable
      实现两个Drawable之间的淡入淡出 ; TransitionDrawable.startTransition() / reverseTransition()
    • InsetDrawable
      将其他Drawable内嵌到自己当中,并在四周留出一定的间距
    • ScaleDrawable
      scaleGravity 对应 gravity ; scaleWidth , scaleHeight指定drawable宽和高的缩放比例,以百分比的形式表示。
      注意scaledrawable受等级的影响,0表示ScaleDrawable不可见。
      不能少了设置等级这一步(setLevel())
    • ClipDrawable
      根据当前的level来裁剪另一个drawable,裁剪的方向通过clipOrentation , gravity来共同控制 ; gravity是表示将被裁剪的图片放在哪 , 裁剪的方向与gravity方向相反;
      对于ClipDrawable, 0表示完全裁剪 , 10k表示不裁剪 , 等级越大表示裁剪的区域越小;

    3.自定义Drawable

    必须重写draw() , setAlpha() , setColorFilter() , getOpacity()方法。

    注意:自定义Drawable无法在xml文件中使用

    展开全文
  • 大家都知道,在Android项目当中,drawable文件夹都是用来放置图片资源的,不管是jpg、png、还是9.png,都可以放在这里。除此之外,还有像selector这样的xml文件也是可以放在drawable文件夹下面的。 但是如果你现在...

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/50727753
    好像有挺久时间没更新博客了,最近我为了准备下一个系列的博客,也是花了很长的时间研读源码。很遗憾的是,下一个系列的博客我可能还要再过一段时间才能写出来,那么为了不至于让大家等太久,今天就给大家更新一篇单篇的文章,讲一讲Android drawable方面的微技巧。


    话说微技巧这个词也是我自己发明的,因为drawable这个东西相信大家天天都在使用,每个人都再熟悉不过了,之所以叫微技巧就是对于这个我们再熟悉不过的技术,可能还有一些你所不知道的细节,那今天我们就来一起探究一下这些微小的细节吧。

    大家都知道,在Android项目当中,drawable文件夹都是用来放置图片资源的,不管是jpg、png、还是9.png,都可以放在这里。除此之外,还有像selector这样的xml文件也是可以放在drawable文件夹下面的。

    但是如果你现在使用Android Studio来新建一个项目,你会发现有如下的目录结构:

    嗯?怎么会有这么多mipmap开头的文件夹,而且它们的命名规则和drawable文件夹很相似,也是hdpi、mdpi、xhdpi等等,并且里面还真是放的图片,难道Android项目中放置图片的位置已经改了?

    对于刚刚从Eclipse转向Android Studio的开发者们可能会对mipmap文件夹感到陌生,其实不用担心,我们平时的编程习惯并不需要发生任何改变,因为mipmap文件夹只是用来放置应用程序的icon的,仅此而已。那么在此之前,我们都是把应用程序的icon图标和普通的图片资源一起放到drawable文件夹下的,这样看上去就会比较杂乱,有的时候想从一堆的图片资源里面找icon半天也找不到,而文件一多也就容易出现漏放的情况,但恰恰Android是极度建议我们在每一种分辨率的文件夹下面都放一个相应尺寸的icon的,因此将它们独立出来专门放到mimap文件夹当中就很好地解决了这个问题。

    另外,将icon放置在mipmap文件夹还可以让我们程序的launcher图标自动拥有跨设备密度展示的能力,比如说一台屏幕密度是xxhdpi的设备可以自动加载mipmap-xxxhdpi下的icon来作为应用程序的launcher图标,这样图标看上去就会更加细腻。

    关于建议使用mipmap的原文可以参阅这篇文章:Getting Your Apps Ready for Nexus 6 and Nexus 9, 当然你还是要科学上网的。

    除此之外,对于每种密度下的icon应该设计成什么尺寸其实Android也是给出了最佳建议,icon的尺寸最好不要随意设计,因为过低的分辨率会造成图标模糊,而过高的分辨率只会徒增APK大小。建议尺寸如下表所示:

    密度 建议尺寸
    mipmap-mdpi 48 * 48
    mipmap-hdpi 72 * 72
    mipmap-xhdpi 96 * 96
    mipmap-xxhdpi 144 * 144
    mipmap-xxxhdpi 192 * 192

    然后我们引用mipmap的方式和之前引用drawable的方式是完全一致的,在资源中就使用@mipmap/res_id,在代码就使用R.mipmap.res_id。比如AndroidManifest.xml中就是这样引用ic_launcher图标的:

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>
    </application>

    好的,关于mimap的内容就讲这么多,它并不是本篇文章的重点,接下来我们来真真正正看一些drawable的微技巧。


    首先我准备了一张270*480像素的图片:


    将图片命名为android_logo.png,然后把它放在drawable-xxhdpi文件夹下面。为什么要放在这个文件夹下呢?是因为我的手机屏幕的密度就是xxhdpi的。那么怎么才能知道自己手机屏幕的密度呢?你可以使用如下方法先获取到屏幕的dpi值:

    float xdpi = getResources().getDisplayMetrics().xdpi;
    float ydpi = getResources().getDisplayMetrics().ydpi;

    其中xdpi代表屏幕宽度的dpi值,ydpi代表屏幕高度的dpi值,通常这两个值都是近乎相等或者极其接近的,在我的手机上这两个值都约等于403。那么403又代表着什么意思呢?我们直接参考下面这个表格就知道了:

    dpi范围 密度
    0dpi ~ 120dpi ldpi
    120dpi ~ 160dpi mdpi
    160dpi ~ 240dpi hdpi
    240dpi ~ 320dpi xhdpi
    320dpi ~ 480dpi xxhdpi
    480dpi ~ 640dpi xxxhdpi

    从表中可以看出,403dpi是处于320dpi到480dpi之间的,因此属于xxhdpi的范围。

    图片放好了之后,下面我在布局文件中引用这张图片,如下所示:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
       >
    
        <ImageView
            android:id="@+id/image"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/android_logo"
            />
    
    </LinearLayout>

    在ImageView控件中指定加载android_logo这张图,并把ImageView控件的宽高都设置成wrap_content,这样图片有多大,我们的控件就会有多大。

    现在运行一下程序,效果如下所示:

    由于我的手机分辨率是1080*1920像素的,而这张图片的分辨率是270*480像素的,刚好是手机分辨率的四分之一,因此从上图中也可以看出,android_logo图片的宽和高大概都占据了屏幕宽高的四分之一左右,大小基本是比较精准的。

    到目前为止一切都挺顺利的,不是吗?下面我们尝试做点改变,将android_logo.png这张图移动到drawable-xhdpi文件夹下,注意不是复制一份到drawable-xhdpi文件夹下,而是将图片移动到drawable-xhdpi文件夹下,然后重新运行一下程序,效果如下图所示:

    嗯?怎么感觉图片好像变大了一点,是错觉吗?

    那么我们再将这张图移动到drawable-mdpi文件夹下试试,重新运行程序,效果如下图所示:

    这次肯定不是错觉了,这实在是太明显了,图片被放大了!

    那么为什么好端端的一张图片会被自动放大呢?而且这放大的比例是不是有点太过份了。其实不然,Android所做的这些缩放操作都是有它严格的规定和算法的。可能有不少做了很多年Android的朋友都没去留意过这些缩放的规则,因为这些细节太微小了,那么本篇的微技巧探索里面,我们就来把这些细节理理清楚。

    首先解释一下图片为什么会被放大,当我们使用资源id来去引用一张图片时,Android会使用一些规则来去帮我们匹配最适合的图片。什么叫最适合的图片?比如我的手机屏幕密度是xxhdpi,那么drawable-xxhdpi文件夹下的图片就是最适合的图片。因此,当我引用android_logo这张图时,如果drawable-xxhdpi文件夹下有这张图就会优先被使用,在这种情况下,图片是不会被缩放的。但是,如果drawable-xxhdpi文件夹下没有这张图时, 系统就会自动去其它文件夹下找这张图了,优先会去更高密度的文件夹下找这张图片,我们当前的场景就是drawable-xxxhdpi文件夹,然后发现这里也没有android_logo这张图,接下来会尝试再找更高密度的文件夹,发现没有更高密度的了,这个时候会去drawable-nodpi文件夹找这张图,发现也没有,那么就会去更低密度的文件夹下面找,依次是drawable-xhdpi -> drawable-hdpi -> drawable-mdpi -> drawable-ldpi。
    总体匹配规则就是这样,那么比如说现在终于在drawable-mdpi文件夹下面找到android_logo这张图了,但是系统会认为你这张图是专门为低密度的设备所设计的,如果直接将这张图在当前的高密度设备上使用就有可能会出现像素过低的情况,于是系统自动帮我们做了这样一个放大操作。

    那么同样的道理,如果系统是在drawable-xxxhdpi文件夹下面找到这张图的话,它会认为这张图是为更高密度的设备所设计的,如果直接将这张图在当前设备上使用就有可能会出现像素过高的情况,于是会自动帮我们做一个缩小的操作。所以,我们可以尝试将android_logo这张图移动到drawable-xxxhdpi文件夹下面将会得到这样的结果:

    可以看到,现在图片的宽和高都达到不手机屏幕的四分之一,说明图片确实是被缩小了。

    另外,刚才在介绍规则的时候提到了一个drawable-nodpi文件夹,这个文件夹是一个密度无关的文件夹,放在这里的图片系统就不会对它进行自动缩放,原图片是多大就会实际展示多大。但是要注意一个加载的顺序,drawable-nodpi文件夹是在匹配密度文件夹和更高密度文件夹都找不到的情况下才会去这里查找图片的,因此放在drawable-nodpi文件夹里的图片通常情况下不建议再放到别的文件夹里面。

    图片被放大的原因现在我们已经搞清楚了,那么接下来还有一个问题,就是放大的倍数是怎么确定的呢?很遗憾,我没有找到相关的文档记载,但是我自己总结出了一个规律,这里跟大家分享一下。

    还是看一下刚才的 dpi范围-密度 表格:

    dpi范围 密度
    0dpi ~ 120dpi ldpi
    120dpi ~ 160dpi mdpi
    160dpi ~ 240dpi hdpi
    240dpi ~ 320dpi xhdpi
    320dpi ~ 480dpi xxhdpi
    480dpi ~ 640dpi xxxhdpi

    可以看到,每一种密度的dpi范围都有一个最大值,这个最大值之间的比例就是图片会被系统自动放大的比例。
    口说无凭,下面我们来通过实例验证一下,修改布局文件中的代码,如下所示:

    <LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
       >
    
        <ImageView
            android:id="@+id/image"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/android_logo"
            />
    
        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="获取图片宽高"
            android:onClick="buttonClick"
            />
    
    </LinearLayout>

    可以看到,我们添加了一个按钮,并给按钮注册了一个点击事件。然后在MainActivity中处理这个点击事件:

    public class MainActivity extends AppCompatActivity {
    
        ImageView imageView;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            imageView = (ImageView) findViewById(R.id.image);
        }
    
    
        public void buttonClick(View view) {
            Toast.makeText(this, "图片宽度:" + imageView.getWidth(), Toast.LENGTH_SHORT).show();
            Toast.makeText(this, "图片高度:" + imageView.getHeight(), Toast.LENGTH_SHORT).show();
        }
    }

    这里在点击事件中分别获取图片的宽和高并使用Toast提示出来。代码修改这么多就可以了,然后将图片移动到drawable-mdpi文件夹下。

    下面我们来开始分析,mdpi密度的最高dpi值是160,而xxhdpi密度的最高dpi值是480,因此是一个3倍的关系,那么我们就可以猜测,放到drawable-mdpi文件夹下的图片在xxhdpi密度的设备上显示会被放大3倍。对应到android_logo这张图,原始像素是270*480,放大3倍之后就应该是810*1440像素。下面运行程序,效果如下图所示:

    验证通过。我们再来试验一次,将图片移动到drawable-xxxhdpi目录下。xxxhdpi密度的最高dpi值是640,480是它的0.75倍,那么我们就可以猜测,放到drawable-xxxdpi文件夹下的图片在xxhdpi密度的设备上显示会被缩小至0.75倍。270*480的0.75倍应该是202.5*360,由于像素不支持小数点,那么四舍五入就应该是203*360像素。重新运行程序,效果如下图所示:

    再次验证通过。如果你有兴趣的话可以使用其它几种dpi的drawable文件夹来试一试,应该都是适配这套缩放规则的。这样我们就把图片为什么会被缩放,以及具体的缩放倍数都搞明白了,drawable相关的细节你已经探究的非常细微了。

    不过本篇文章到这里还没结束,下面我准备讲一讲我们在实际开发当中会遇到的场景。根据Android的开发建议,我们在准备图片资源时尽量应该给每种密度的设备都准备一套,这样程序的适配性就可以达到最好。但实际情况是,公司的UI们通常就只会给一套图片资源,想让他们针对每种密度的设备都设计一套图片资源,并且还是按照我们上面讲的缩放比例规则来设计,就有点想得太开心了。没错,这个就是现实情况,那么在这种情况下,我们应该将仅有的这一套图片资源放在哪个密度的文件夹下呢?

    可以这样来分析,根据我们刚才所学的内容,如果将一张图片放在低密度文件夹下,那么在高密度设备上显示图片时就会被自动放大,而如果将一张图片放在高密度文件夹下,那么在低密度设备上显示图片时就会被自动缩小。那我们可以通过成本的方式来评估一下,一张原图片被缩小了之后显示其实并没有什么副作用,但是一张原图片被放大了之后显示就意味着要占用更多的内存了。因为图片被放大了,像素点也就变多了,而每个像素点都是要占用内存的。

    我们仍然可以通过例子来直观地体会一下,首先将android_logo.png图片移动到drawable-xxhdpi目录下,运行程序后我们通过Android Monitor来观察程序内存使用情况:

    可以看到,程序所占用的内存大概稳定在19.45M左右。然后将android_logo.png图片移动到drawable-mdpi目录下,重新运行程序,结果如下图所示:

    现在涨到23.40M了,占用内存明显增加了。如果你将图片移动到drawable-ldpi目录下,你会发现占用内存会更高。

    通过这个例子同时也验证了一个问题,我相信有不少比较有经验的Android程序员可能都遇到过这个情况,就是当你的项目变得越来越大,有的时候加载一张drawable-hdpi下的图片,程序就直接OOM崩掉了,但如果将这张图放到drawable-xhdpi或drawable-xxhdpi下就不会崩掉,其实就是这个道理。

    那么经过上面一系列的分析,答案自然也就出来了,图片资源应该尽量放在高密度文件夹下,这样可以节省图片的内存开支,而UI在设计图片的时候也应该尽量面向高密度屏幕的设备来进行设计。就目前来讲,最佳放置图片资源的文件夹就是drawable-xxhdpi。那么有的朋友可能会问了,不是还有更高密度的drawable-xxxhdpi吗?干吗不放在这里?这是因为,市面上480dpi到640dpi的设备实在是太少了,如果针对这种级别的屏幕密度来设计图片,图片在不缩放的情况下本身就已经很大了,基本也起不到节省内存开支的作用了。


    好的,关于drawable微技巧方面的探索我们就讲到这里,本篇文章中也是集合了不少我平时的工作经验总结,以及通过做试验所得出的一些结论,相信还是可以给大家带来不少帮助的。后面我会抓紧时间继续准备新系列的内容,敬请期待。

    关注我的技术公众号,每天都有优质技术文章推送。关注我的娱乐公众号,工作、学习累了的时候放松一下自己。

    微信扫一扫下方二维码即可关注:

    20160507110203928         20161011100137978

    展开全文
  • android(drawable文件夹)图片适配

    万次阅读 2017-06-03 01:02:33
    如果图片所在目录dpi低于匹配目录,那么该图片被认为是为低密度设备需要的,现在要显示在高密度设备上,图片会被放大。...如果图片所在目录为drawable-nodpi,则无论设备dpi为多少,保留原图片大小,不进行缩放。

    说到android的drawable文件夹没搞清楚就开始开发爱屁屁简直就是噩梦一般的存在

    很荣幸,我就经历了这个过程......

    废话不多说,直接上干货(参考http://blog.csdn.net/myoungmeng/article/details/54090891)

    android的drawable文件一共可以有:drawable-ldpi(低密度)     drawable-mdpi(中等密度)     drawable-hdpi(高密度)     drawable-xhdpi(超高密度)     drawable-xxhdpi(超超高密度)     drawable-xxxhdpi(超超超高密度)     drawable-nohdpi(无缩放)     当然还加上默认的drawable

     

     

    ----------以下是重点理解内容,一定要看懂----------

     

    比如在一个中等分辨率的手机上,Android就会选择drawable-mdpi文件夹下的图片,文件夹下有这张图就会优先被使用,在这种情况下,图片是不会被缩放的;

    但是如果没有在drawable-mdpi的文件夹下找到相应图片的话,Android系统会首先从更高一级的drawable-hdpi文件夹中查找,如果找到图片资源就进行缩放处理,显示在屏幕上;

    如果drawable-hdpi文件夹下也没有的话,就依次往drawable-xhdpi文件夹、drawable-xxhdpi文件夹drawable-xxxhdpi文件夹drawable-nodpi;

    如果更高密度的文件夹里都没有找到,就往更低密度的文件夹里寻找,drawable-ldpi文件夹下查找;

    如果都没找到,最终会在默认的drawable文件夹中寻找,如果默认的drawable文件夹中也没有那就会报错啦。(前提是把一张图片做成很多不同的分辨率放在各个对应密度的drawable文件夹下)

     

     

    如何知道自己设备的dpi:

    float xdpi = getResources().getDisplayMetrics().xdpi;
    float ydpi = getResources().getDisplayMetrics().ydpi;

     

    知道设备的dpi后就知道设备首先会在哪个drawable文件夹下去寻找了:

    dpi范围密度对应范围

     

      密度
    0dpi ~ 120dpi ldpi
    120dpi ~ 160dpi mdpi
    160dpi ~ 240dpi hdpi
    240dpi ~ 320dpi xhdpi
    320dpi ~ 480dpi xxhdpi
    480dpi ~ 640dpi xxxhdpi

    比如博主的测试机是222的dpi那就是高密度,系统会首先去找drawable-hdpi下的图片

     

     

     

    对于每种密度下的icon应该设计成什么尺寸其实Android也是给出了最佳建议,建议尺寸如下表所示:

     

      建议尺寸
    mipmap-mdpi 48 * 48(博主实测图标16就够了)
    mipmap-hdpi 72 * 72(博主实测图标32就够了)
    mipmap-xhdpi 96 * 96(博主实测图标48就够了)
    mipmap-xxhdpi 144 * 144(博主实测图标64就够了)
    mipmap-xxxhdpi 192 * 192(博主实测图标72就够了)

     

     

    总体匹配规则就是这样:

     

    如果图片所在目录dpi低于匹配目录,那么该图片被认为是为低密度设备需要的,现在要显示在高密度设备上,图片会被放大。

    如果图片所在目录dpi高于匹配目录,那么该图片被认为是为高密度设备需要的,现在要显示在低密度设备上,图片会被缩小。

    如果图片所在目录为drawable-nodpi,则无论设备dpi为多少,保留原图片大小,不进行缩放。

     

     

    -----------------------以下是非重点内容,没耐心的小伙伴可以在这里截至啦----------------------

     


    drawable-nodpi文件夹,这个文件夹是一个密度无关的文件夹,放在这里的图片系统就不会对它进行自动缩放,原图片是多大就会实际展示多大。但是要注意一个加载的顺序,drawable-nodpi文件夹是在匹配密度文件夹和更高密度文件夹都找不到的情况下才会去这里查找图片的,因此放在drawable-nodpi文件夹里的图片通常情况下不建议再放到别的文件夹里面。

    优缺点:当一张图片被放大时,像素增加,必然会引起内存占用量增加,而且放大后可能存在不清晰的情况;图片被缩小时,像素减少,内存占用量就会降低,但是打包后的APK体积会增大。

    图片资源应该尽量放在高密度文件夹下,这样可以节省图片的内存开支,而UI在设计图片的时候也应该尽量面向高密度屏幕的设备来进行设计。就目前来讲,最佳放置图片资源的文件夹就是drawable-xxhdpi。那么有的朋友可能会问了,不是还有更高密度的drawable-xxxhdpi吗?干吗不放在这里?这是因为,市面上480dpi到640dpi的设备实在是太少了,如果针对这种级别的屏幕密度来设计图片,图片在不缩放的情况下本身就已经很大了,基本也起不到节省内存开支的作用了。

     

    收工~~~~~~~~~~~~

     

    展开全文
  • 安卓 Drawable 转 bitmap

    2014-02-13 02:49:21
    本人将后缀为png的图片放在res->drawable-hdpi下。现在想将其转换为bitmap然后作其他处理,看到网上很多的文章。 方法1------------------------------------ Resources res...
  • 在 activity_main.xml 中,有两行代码`android:background="@drawable/border_ui"`和`android:background="@drawable/my"`,但是使用 border_ui.xml 的这个位于文件夹 res\drawable,另外一个使用文件 drawable.xml ...
  • android drawable

    2015-10-10 09:18:27
    android.graphics.drawable.Drawable是个虚类。 它的直接子类有 BitmapDrawable, ClipDrawable, ColorDrawable, DrawableContainer, GradientDrawable,  InsetDrawable, LayerDrawable, NinePatchDrawable...
    android.graphics.drawable.Drawable是个虚类。
    它的直接子类有
    BitmapDrawable, ClipDrawable, ColorDrawable, DrawableContainer, GradientDrawable, 
    InsetDrawable, LayerDrawable, NinePatchDrawable, PictureDrawable, RotateDrawable, 
    ScaleDrawable, ShapeDrawable
    间接子类有
    AnimationDrawable, LevelListDrawable, PaintDrawable, StateListDrawable, TransitionDrawable

    Class Overview

    A Drawable is a general abstraction for "something that can be drawn." Most often you will deal with Drawable as the type of resource retrieved for drawing things to the screen; the Drawable class provides a generic API for dealing with an underlying visual resource that may take a variety of forms. Unlike a View, a Drawable does not have any facility to receive events or otherwise interact with the user.

    In addition to simple drawing, Drawable provides a number of generic mechanisms for its client to interact with what is being drawn:

    • The setBounds(Rect) method must be called to tell the Drawable where it is drawn and how large it should be. All Drawables should respect the requested size, often simply by scaling their imagery. A client can find the preferred size for some Drawables with the getIntrinsicHeight() and getIntrinsicWidth()methods.这个用来设置Drawable要画好大
    • The getPadding(Rect) method can return from some Drawables information about how to frame content that is placed inside of them. For example, a Drawable that is intended to be the frame for a button widget would need to return padding that correctly places the label inside of itself.这个接口用于返回padding,这个padding其实表示的是控件的content的padding
    • The setState(int[]) method allows the client to tell the Drawable in which state it is to be drawn, such as "focused", "selected", etc. Some drawables may modify their imagery based on the selected state.
    • The setLevel(int) method allows the client to supply a single continuous controller that can modify the Drawable is displayed, such as a battery level or progress level. Some drawables may modify their imagery based on the current level.
    • A Drawable can perform animations by calling back to its client through the Drawable.Callback interface. All clients should support this interface (viasetCallback(Drawable.Callback)) so that animations will work. A simple way to do this is through the system facilities such assetBackgroundDrawable(Drawable) and ImageView.
    Drawable定义了一个可画的对象一些接口。
    它是抽象类。我们只能实例化它的实现类。Drawable就是一个可画的对象,其可能是一张位图(BitmapDrawable),也可能是一个图形(ShapeDrawable),还有可能是一个图层(LayerDrawable),我们根据画图的需求,创建相应的可画对象。 
    注意1:如果要手动调用draw(Canvas canvas)来画Drawable,
    一定要在之前通过
    void        setBounds(Rect bounds)
    来设置其需要画到的区域。
    注意2: 可通过setCallback(Drawable.Callback)来实现动画。
    构造函数
    Public Constructors
    Drawable()
    主要函数
    Public Methods
    void clearColorFilter()
    final Rect copyBounds()
    Return a copy of the drawable's bounds in a new Rect.
    final void copyBounds(Rect bounds)
    Return a copy of the drawable's bounds in the specified Rect (allocated by the caller).
    static Drawable createFromPath(String pathName)
    Create a drawable from file path name.
    static Drawable createFromResourceStream(Resources res, TypedValue value, InputStream is, String srcName, BitmapFactory.Options opts)
    Create a drawable from an inputstream, using the given resources and value to determine density information.
    static Drawable createFromResourceStream(Resources res, TypedValue value, InputStream is, String srcName)
    Create a drawable from an inputstream, using the given resources and value to determine density information.
    static Drawable createFromStream(InputStream is, String srcName)
    Create a drawable from an inputstream
    static Drawable createFromXml(Resources r, XmlPullParser parser)
    Create a drawable from an XML document.
    static Drawable createFromXmlInner(Resources r, XmlPullParser parser, AttributeSet attrs)
    Create from inside an XML document.
    abstract void draw(Canvas canvas)
    Draw in its bounds (set via setBounds) respecting optional effects such as alpha (set via setAlpha) and color filter (set via setColorFilter).
    final Rect getBounds()
    Return the drawable's bounds Rect.
    Drawable.Callback getCallback()
    Return the current Drawable.Callback implementation attached to this Drawable.
    int getChangingConfigurations()
    Return a mask of the configuration parameters for which this drawable may change, requiring that it be re-created.
    Drawable.ConstantState getConstantState()
    Return a Drawable.ConstantState instance that holds the shared state of this Drawable.
    Drawable getCurrent()
    int getIntrinsicHeight()
    Return the intrinsic height of the underlying drawable object.
    int getIntrinsicWidth()
    Return the intrinsic width of the underlying drawable object.
    final int getLevel()
    Retrieve the current level.
    int getMinimumHeight()
    Returns the minimum height suggested by this Drawable.
    int getMinimumWidth()
    Returns the minimum width suggested by this Drawable.
    abstract int getOpacity()
    Return the opacity/transparency of this Drawable.
    boolean getPadding(Rect padding)
    Return in padding the insets suggested by this Drawable for placing content inside the drawable's bounds.
    int[] getState()
    Describes the current state, as a union of primitve states, such as state_focusedstate_selected, etc.
    Region getTransparentRegion()
    Returns a Region representing the part of the Drawable that is completely transparent.
    void inflate(Resources r, XmlPullParser parser, AttributeSet attrs)
    Inflate this Drawable from an XML resource.
    void invalidateSelf()
    Use the current Drawable.Callback implementation to have this Drawable redrawn.
    boolean isStateful()
    Indicates whether this view will change its appearance based on state.
    final boolean isVisible()
    void jumpToCurrentState()
    If this Drawable does transition animations between states, ask that it immediately jump to the current state and skip any active animations.
    Drawable mutate()
    Make this drawable mutable.
    static int resolveOpacity(int op1, int op2)
    Return the appropriate opacity value for two source opacities.
    void scheduleSelf(Runnable what, long when)
    Use the current Drawable.Callback implementation to have this Drawable scheduled.
    abstract void setAlpha(int alpha)
    Specify an alpha value for the drawable.
    void setBounds(int left, int top, int right, int bottom)
    Specify a bounding rectangle for the Drawable.
    void setBounds(Rect bounds)
    Specify a bounding rectangle for the Drawable.
    final void setCallback(Drawable.Callback cb)
    Bind a Drawable.Callback object to this Drawable.
    void setChangingConfigurations(int configs)
    Set a mask of the configuration parameters for which this drawable may change, requiring that it be re-created.
    abstract void setColorFilter(ColorFilter cf)
    Specify an optional colorFilter for the drawable.
    void setColorFilter(int color, PorterDuff.Mode mode)
    Specify a color and porterduff mode to be the colorfilter for this drawable.
    void setDither(boolean dither)
    Set to true to have the drawable dither its colors when drawn to a device with fewer than 8-bits per color component.
    void setFilterBitmap(boolean filter)
    Set to true to have the drawable filter its bitmap when scaled or rotated (for drawables that use bitmaps).
    final boolean setLevel(int level)
    Specify the level for the drawable.
    boolean setState(int[] stateSet)
    Specify a set of states for the drawable.
    boolean setVisible(boolean visible, boolean restart)
    Set whether this Drawable is visible.
    void unscheduleSelf(Runnable what)
    Use the current Drawable.Callback implementation to have this Drawable unscheduled.
    Protected Methods
    void onBoundsChange(Rect bounds)
    Override this in your subclass to change appearance if you recognize the specified state.
    boolean onLevelChange(int level)
    Override this in your subclass to change appearance if you vary based on level.
    boolean onStateChange(int[] state)
    Override this in your subclass to change appearance if you recognize the specified state.
    直接子类
    BitmapDrawable     A Drawable that wraps a bitmap. You can create a BitmapDrawable from a file path, 
                                    an input stream, through XML inflation, or from a Bitmap object. 
                                它的本质是个bitmap,它提供了针对bitmap的实现。
    注意:Android supports bitmap files in a three formats: .png (preferred), .jpg (acceptable), .gif (discouraged).
    也是说Android把.png,.jpg,.gif都是看为BitmapDrawable,Android应该是把这三种图片转为bitmap来处理。
    其实任何图片绘画时最后都是转为bitmap来处理

            BitmapDrawable bitmapDrawable=(BitmapDrawable)context.getResources().getDrawable(R.drawable.icon);
            Bitmap bitmap=bitmapDrawable.getBitmap();

    可以通过上面的形式把BitmapDrawable转化为Bitmap
    ClipDrawable     A Drawable that clips another Drawable based on this Drawable's current level value. 
    具体参照《ClipDrawable
    ColorDrawable     A specialized Drawable that fills the Canvas with a specified color, with respect to the clip region. 
    DrawableContainer
        它应该是专门用来存放Drawable的。
        如何直接使用它还不知道。它不能在XML文件中定义。
        它的子类AnimationDrawable, LevelListDrawable, StateListDrawable        
    GradientDrawable     A Drawable with a color gradient for buttons, backgrounds, etc.
        It can be defined in an XML file with the <shape> element. For more information。 
    InsetDrawable     A Drawable that insets another Drawable by a specified distance. 
    LayerDrawable     A Drawable that manages an array of other Drawables. 
    NinePatchDrawable     A resizeable bitmap, with stretchable areas that you define. 
    它对应的是.9.png文件。关于此请参考《个性缩放图片NinePatchDrawable
    PictureDrawable     Drawable subclass that wraps a Picture, allowing the picture to be used whereever a Drawable is supported. 
    RotateDrawable     
    A Drawable that can rotate another Drawable based on the current level value. 
    ScaleDrawable     A Drawable that changes the size of another Drawable based on its current level value. 
    ShapeDrawable     A Drawable object that draws primitive shapes. 关于此请参考《ShapeDrawable
    ColorDrawable
        A specialized Drawable that fills the Canvas with a specified color, 
        with respect to the clip region. Note that a ColorDrawable ignores the ColorFilter. 
        It also ignores the Bounds, meaning it will draw everywhere in the current clip, 
        even if setBounds(...) was called with a smaller area.
        It can be defined in an XML file with the <color> element.
    注意1:它会忽略掉ColorFilter和Bounds,它会把整个clip区域都填充成指定的颜色。
    在XML中定义和引用ColorDrawable
    A color resource can also be used as a drawable in XML. For example,
    when creating a state list drawable, you can reference a color resource for the android:drawable attribute 
    (android:drawable="@color/green
    在values下的Colors.xml文件:
    <?xml version="1.0" encoding="UTF-8"?>
    <resources>
    <
    color name="red">#FFFF0000</color>
    </resources>

    像引用Drawable一样引用它
    <TextView  
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content" 
        android:text="@string/hello"
        android:background="
    @color/red"
        />
    展开全文
  • Shape Drawable

    千次阅读 2014-11-11 11:19:47
    当你想动态的绘制一些而为图形...ShapeDrawable是Drawable的一个子类,所以你可以在使用Drawable可以使用的地方使用他。例如你可以通过setBackgroundDrawable()把他设置为一个View的背景。当然,你也可以在拥有他的自定
  • <item android:drawable="@drawable/music_play_activated" android:state_pressed="true"/>![图片说明](https://img-ask.csdn.net/upload/201503/04/1425426977_733441.png) <item android:drawable="@drawable/...
  • Android Drawable 那些不为人知的高效用法

    万次阅读 多人点赞 2015-02-26 09:21:13
    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/43752383,...那么什么是Drawable呢?能够在canvas上绘制的一个玩意,而且相比于View,并不需要去考虑measure、layout,仅仅只要去考虑如何draw(c
  • int[] picItems = {R.drawable.pic_one, R.drawable.pic_two, R.drawable.pic_three}; 然后,picItem的数组是空的。我想要能够从一个索引里取到这些值然后用它作为背景,就像这样: relative....
  • public String drawableToByte(Drawable drawable) { if (drawable != null) { Bitmap bitmap = Bitmap .createBitmap( drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), drawable.getOpacity...
  • android.graphics.drawable.Drawable注释翻译

    千次阅读 2015-08-09 11:44:09
    /* * Copyright (C) 2006 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * Yo
  • Android Icon Size and Location for Apps DENSITY SIZE LOCATION RATIO SCREEN MARGIN XXXHDPI ... drawable-xxxhdpi 4 640 DPI 12 to 16 pixels XXHDPI 144×14...
  • Android中的Drawable基础与自定义Drawable

    万次阅读 多人点赞 2018-01-22 01:47:48
    介绍Android中Drawable的相关知识点,并且介绍如何自定义Drawable。 2. Drawable能实现缩放、渐变、逐帧动画、静态矢量图、矢量图动画等功能 3. Drawable提供一种比自定义View更轻量级的...
  • [2016-11-06 11:18:11 - Activity] C:\Users\宁胖胖\workspace2\Activity\AndroidManifest.xml:11: error: Error: No resource found that matches the given name (at 'icon' with value '@drawable/ic_launcher')....
  • Drawable Resource 一个Drawable资源是绘图中的一个普通概念,可以再屏幕上绘制出来。可以通过APIs中的getDrawable(int)方法检索出来,也可以在其他的XML资源中通过android:drawable和android:icon等属性使用它。...
  • setBackgroundDrawable()在API 16(4.1)已经过时了 4.1之后有两种方法可以代替: a、setBackgroundResource b、setBackground 例如: textView.setBackgroundResource(R.drawable.icon)...
  • drawable 概念定义 BitMap Drawable 介绍 StateLikst Drawable介绍 LevelList Drawable 介绍 TransitionDrawable 介绍 InsertDraable 介绍 LayerDrawable 介绍 ClipDrawable 介绍 自定义Drawable Drawable 概念 一...
  • Drawable的使用范围很单一,一个是作为ImageView中的图像来显示,另一个就是zuoweiView的背景,大多数情况下Drawable都是以View的背景这种形式出现的。 通常我们是没有必要自定义Drawable的,这是因为自定义的...
  • TransitionDrawable是能在两个drawable资源之间淡入淡出切换的drawable对象。 每个drawable在元素中都用元素表示。不支持两个以上的项。向前过渡使用startTransition()。向后调用使用reverseTransition()。 文件位置...

空空如也

1 2 3 4 5 ... 20
收藏数 33,133
精华内容 13,253
关键字:

drawable