精华内容
下载资源
问答
  • Drawable

    2016-07-01 15:37:55
    Drawable

    Drawable是一种抽象的可以被绘制的对象。和View不同的是,Drawable不能接收事件,也不能和用户进行交互。
    Drawable定义了一些通用机制,供客户端调用。例如setBounds是用来确定Drawable绘制的位置和大小的,因此必须被调用。可以通过缩放来改变Drawable大小。可以通过getIntrinsicHeight和getIntrinsicWidth获取Drawable宽和高。
    Drawable的展现形式有多种:
    Bitmap:最简单的Drawable,是一张PNG或JPEG图片。
    Nine Patch:一种扩展的PNG,(.9)可以进行拉伸和指定内容显示范围。
    Shape:不是原始位图,可以更好的调整大小。
    Layers:多层Drawable,层层绘制
    States:(selector)根据状态从集合中选择Drawable。
    Levels:根据level选择drawable
    Scale:根据level对图片进行缩放。

    Drawable 提供了一个回调接口,Callback。如果你想为Drawable子类创建一个动画drawable,可以实现这个接口。
    这个回调接口提供了三个方法,

    当drawable需要重画的时候会调用这个方法,此时设置drawable的view会被刷新。
    public void invalidateDrawable(Drawable who);
    可以调用这个方法执行下一帧动画,实现这个接口的类可以简单的调用Handler.postAtTime(Runnable, Object, long)方法
    public void scheduleDrawable(Drawable who, Runnable what, long when);
    与scheduleDrawable相对应,取消要执行的任务,通过调用Handler.removeCallbacks(Runnable, Object)方法。
    public void unscheduleDrawable(Drawable who, Runnable what);

    Drawable的经常使用的方法有以下几个:

    为Drawable指定一个矩形的边界
    public void setBounds(int left, int top, int right, int bottom) {
            Rect oldBounds = mBounds;
    
            if (oldBounds == ZERO_BOUNDS_RECT) {
                oldBounds = mBounds = new Rect();
            }
    
            if (oldBounds.left != left || oldBounds.top != top ||
                    oldBounds.right != right || oldBounds.bottom != bottom) {
                    //如果要设置的边界和之前的不相同,并且不是第一次设置,会调用invalidateSelf()方法,这个方法里会判断是否设置了回调,如果设置了,调用callback的invalidateDrawable()方法。
                if (!oldBounds.isEmpty()) {
                    // first invalidate the previous bounds
                    invalidateSelf();
                }
                //给mBounds重新赋值。
                mBounds.set(left, top, right, bottom);
                onBoundsChange(mBounds);//子类重写这个方法来实现自己的逻辑。
            }
        }
    根据bounds(必须)、透明度、颜色过滤器等进行绘制。
    public abstract void draw(Canvas canvas);
    为drawable设置透明度
    public abstract void setAlpha(int alpha);
    给支持Xfermode的drawable设置Xfermode。
    public void setXfermode(Xfermode mode) {
            // Base implementation drops it on the floor for compatibility. Whee!
        }
    设置颜色过滤器,如果设置了ColorFilter ,每个像素会被修改。
    public abstract void setColorFilter(@Nullable ColorFilter colorFilter);
    为drawable设置着色的颜色。在绘制到屏幕之前,Drawable绘制的内容会和这个颜色混合在一起。
    public void setTint(@ColorInt int tintColor) {
            setTintList(ColorStateList.valueOf(tintColor));
        }
    为Drawable指定一组状态,例如获取焦点,按下,选中等。如果新的状态引起drawble外观的变化,会调用invalidateSelf,进行重画。
    需要注意的是:Drawable持有stateSet的引用,直到被设置了新的状态数组,所以stateSet使用期间不能对它进行修改。
     public boolean setState(final int[] stateSet) {
            if (!Arrays.equals(mStateSet, stateSet)) {
                mStateSet = stateSet;
                return onStateChange(stateSet);
            }
            return false;
        }
    获取drawable的宽度,如果没有宽度返回-1,例如颜色值。
    public int getIntrinsicWidth() {
            return -1;
        }
    使Drawable状态可变,这个操作不能逆转。一个可变的Drawable不会和其他Drawable共享状态。如果需要修改从resources加载的drawable的属性,这个方法非常有用。默认情况下,同一个资源文件,虽然有多个实例,但是它们共享共同的状态,如果修改了其中任意一个实例的状态,其他的也会接收到相同的变化。调用这个方法得到的Drawable,修改状态后不会影响其他实例。
    public Drawable mutate() {
            return this;
        }

    Drawable还有一个很重要的类是ConstantState,每一种Drawable都有自己的实现类。这个类用来存储drawables之间的共享常量状态和数据。例如从同一个资源文件创建的BitmapDrawables,它们实例里的ConstantState里会存储同一个位图。

    public static abstract class ConstantState {
            在不提供Resources情况下生成一个Drawable。
            注意:使用此方法会导致依赖于密度的drawable(例如Bitmap)无法正确的更新目标密度(图片的大小取决于屏幕密度和所在drawable的文件夹的密度)。所以应该调用newDrawable(Resources)这个方法。
            public abstract Drawable newDrawable();
    
    
            根据ConstantState生成新的Drawable。基于密度变化的drawable必须实现此方法。(例如Bitmap)
            public Drawable newDrawable(Resources res) {
                return newDrawable();
            }
    
        根据ConstantState生成新的Drawable。设置了主题的drawable必须实现此方法。
            public Drawable newDrawable(Resources res, Theme theme) {
                return newDrawable(null);
            }
        }

    根据资源id获取Drawable一般调用这个方法
    getResources().getDrawable(@DrawableRes int id, @Nullable Theme theme);(api21)
    这个方法里调用了loadDrawable(value, id, theme);重点来看下这个方法是如何加载drawable的。

    @Nullable
        Drawable loadDrawable(TypedValue value, int id, Theme theme) throws NotFoundException {
            //...................根据value.data 得到key值
    
            // 首先根据key从DrawableCache里查找是否有drawable缓存,drawable已经被加载过,并设置了指定的主题。DrawableCache.getInstance方法先根据key和theme找到ConstantState,如果ConstantState有值,会调用newDrawable(Resources res, Theme theme)方法生成一个新的Drawable对象,所以尽管实例不一样,但是共享同一个ConstantState。
            if (!mPreloading) {
                final Drawable cachedDrawable = caches.getInstance(key, theme);
                if (cachedDrawable != null) {
                    return cachedDrawable;
                }
            }
    
            //对drawable进行预加载,没有设置主题的一些属性
    
            final ConstantState cs;
            if (isColorDrawable) {
                cs = sPreloadedColorDrawables.get(key);
            } else {
                cs = sPreloadedDrawables[mConfiguration.getLayoutDirection()].get(key);
            }
    
            Drawable dr;
            if (cs != null) {
                dr = cs.newDrawable(this);
            } else if (isColorDrawable) {
                dr = new ColorDrawable(value.data);
            } else {
            //如果是xml文件,会使用XmlResourceParser生成drawable。否则mAssets会根据资源文件生成InputStream,然后调用Drawable.createFromResourceStream生成drawable。
                dr = loadDrawableForCookie(value, id, null);
            }
    
           //生成drawble以后,如果提供了主题,会为drawable设置主题,
            final boolean canApplyTheme = dr != null && dr.canApplyTheme();
            if (canApplyTheme && theme != null) {
                dr = dr.mutate();
                dr.applyTheme(theme);
                dr.clearMutated();
            }
    
            最后把DrawableCache 、theme等进行缓存。
            if (dr != null) {
                dr.setChangingConfigurations(value.changingConfigurations);
                cacheDrawable(value, isColorDrawable, caches, theme, canApplyTheme, key, dr);
            }
    
            return dr;
        }
    展开全文
  • 大家都知道,在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

    展开全文
  • 在使用AndroidStudio时,项目用到的图片资源存放的位置,是放在drawable下? 还是放在mipmap下?其实google官方已经给出相关介绍: drawable/ For bitmap files (PNG, JPEG, or GIF), 9-Patch image files, and XML ...

    在使用AndroidStudio时,项目用到的图片资源存放的位置,是放在drawable下? 还是放在mipmap下?

    其实google官方已经给出相关介绍:

     

    drawable/

    For bitmap files (PNG, JPEG, or GIF), 9-Patch image files, and XML files that describe Drawable shapes or Drawable objects that contain multiple states (normal, pressed, or focused). See the Drawable resource type.

    mipmap/

    For app launcher icons. The Android system retains the resources in this folder (and density-specific folders such as mipmap-xxxhdpi) regardless of the screen resolution of the device where your app is installed. This behavior allows launcher apps to pick the best resolution icon for your app to display on the home screen.

    也就是说一般将APP的icon放在minmap文件夹下,其他图片资源放在drawable文件夹下。

    ------------------------------------------------------------------------------------------------------------------

    创建项目时候,AndroidStudio会自动创建一个drawable文件夹,如果需要创建针对存放不同尺寸的图片的文件夹,咋整?接下来我们再来说说AndroidStudio下创建drawable-hdpi、drawable-mdpi、drawable-xhdpi、drawable-xxhdpi的方法。

    首先,切换到Project视图下,找到对应moudle的res文件夹,然后执行下面步骤:

    然后,选择drawable,按照图片所示步骤

    点击OK,就可以看到我们要创建的文件夹了。

     

    展开全文
  • drawable 概念定义 BitMap Drawable 介绍 StateLikst Drawable介绍 LevelList Drawable 介绍 TransitionDrawable 介绍 InsertDraable 介绍 LayerDrawable 介绍 ClipDrawable 介绍 自定义Drawable Drawable 概念 一...
    • drawable 概念定义
    • BitMap Drawable 介绍
    • StateLikst Drawable介绍
    • LevelList Drawable 介绍
    • TransitionDrawable 介绍
    • InsertDraable 介绍
    • LayerDrawable 介绍
    • ClipDrawable 介绍
    • 自定义Drawable

    Drawable 概念
    一个抽象类,没有Event 和 交互方法
    两个函数:
    Draw (Canvas canvas)
    SetBounds()

    BitMap Drawable:
    对BitMap的一种包装,包装BitMap后的区域内进行下一步设置,比如:拉伸图像,填充铺满整个区域,
    也可以保持原始大小。

    例 在资源文件drawable 文件下创建bitmap.xml
    内容:

    <?xml version="1.0" encoding="utf-8"?>

    <bitmap xmlns:android=“http://schemas.android.com/apk/res/android
    android:src="@drawable/ic_launcher_background"
    android:tileMode=“mirror” // 平铺方式 repeat 图像平铺 mirror 交替镜像的方式重复图片 clamp 复制边缘色彩 // //disabled - 图像不平铺,默认值
    android:antialias=“true” //android:antialias 设置是否开启抗锯齿
    android:dither=“true”> // dither 抖动

    展开全文
  • Android中的Drawable基础与自定义Drawable

    万次阅读 多人点赞 2018-01-22 01:47:48
    介绍Android中Drawable的相关知识点,并且介绍如何自定义Drawable。 2. Drawable能实现缩放、渐变、逐帧动画、静态矢量图、矢量图动画等功能 3. Drawable提供一种比自定义View更轻量级的...
  • AS drawable

    2018-12-28 21:52:45
    详细了解请看Android 开发之关于 drawable 你必须知道的规则 注意; 1、如果想使用原始位图资源,应该将资源文件(图片)添加到drawable-nodpi文件夹下,drawable-nodpi文件夹的添加请参见Android Studio 新建...
  • Drawable的使用范围很单一,一个是作为ImageView中的图像来显示,另一个就是zuoweiView的背景,大多数情况下Drawable都是以View的背景这种形式出现的。 通常我们是没有必要自定义Drawable的,这是因为自定义的...
  • android drawable

    2015-10-10 09:18:27
    android.graphics.drawable.Drawable是个虚类。 它的直接子类有 BitmapDrawable, ClipDrawable, ColorDrawable, DrawableContainer, GradientDrawable,  InsetDrawable, LayerDrawable, NinePatchDrawable...
  • Drawable转换成一个Bitmap

    万次阅读 2019-02-18 17:39:04
    /** * Drawable转换成一个Bitmap * * @param drawable drawable对象 ... public static final Bitmap drawableToBitmap(Drawable drawable) { Bitmap bitmap = Bitmap.createBitmap( d...
  • 对于android5.0及以上版本,应用的res目录下可以包含drawabledrawable-ldpi、drawable-mdpi、drawable-hdpi、drawable-xhdpi、drawable-xxhdpi子目录。在这些目录中存放drawable资源。 当应用需要使用drawable...
  • drawable-xhdpi对应像素密度为720*1280,drawable-hdpi像素密度为480*800 。在dp和px 转换关系中,如果当前分辨率为xhdpi ,那么1dp=2px。如果当前分辨率为hdpi ,那么1dp=1.5px .所以在设计图片建议是采用xhdpi...
  • Drawable 详解

    2018-05-23 18:33:58
    public abstract class Drawable extends Object java.lang.Object ↳android.graphics.drawable.DrawableKnown direct subclasses 直接子类AdaptiveIconDrawable, AnimatedImageDrawable, ...
  • 自定义Drawable

    2016-09-29 21:19:29
    在Android设计中,Drawable是一个抽象基类,它是所有Drawable对象的基类,每个具体的Drawable都是它的子类。通常没有必要去自定义Drawable,因为自定义Drawable无法再XML中使用,这就降低了自定义Drawable的使用范围...
  • 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...
  • Drawable Animation

    2016-05-23 11:41:19
    Drawable animation是什么? Drawable animation是一种动画类型。Drawable animation的用途? Drawable animation可以用来以你指定的顺序播放一组图片。可以循环播放,也可以只播放一次。Drawable animation怎么...
  • Shape Drawable

    千次阅读 2014-11-11 11:19:47
    当你想动态的绘制一些而为图形...ShapeDrawable是Drawable的一个子类,所以你可以在使用Drawable可以使用的地方使用他。例如你可以通过setBackgroundDrawable()把他设置为一个View的背景。当然,你也可以在拥有他的自定
  • TransitionDrawable是能在两个drawable资源之间淡入淡出切换的drawable对象。 每个drawable在元素中都用元素表示。不支持两个以上的项。向前过渡使用startTransition()。向后调用使用reverseTransition()。 文件位置...
  • 关于drawabledrawable-v24

    万次阅读 2018-03-16 14:00:16
    今天调试一个软件,老是找不到资源...最后找到原因是我将图片资源放到drawable-v24里面,导致7.0以下不能找到图片 不同的drawable文件夹用于为设备兼容性和不同的Android版本提供不同的屏幕密度。7.0的关于图片资
  • 随着AS版本及android系统的版本不断升级,新建项目的默认创建适配文件也由drawable-21升级到了drawable-24,这个文件与targetSdkVersion及手机android系统版本是什么关系呢? drawable-21 适配5.0及以上手机资源文件...
  • DrawableTint

    2017-03-02 11:43:54
    用于对控件中的图片做色,统一...android.support.v4.graphics.drawable.DrawableCompat//适配低版本,为了使用drawableTint(要求API>=23) //ColorStateList为定义的状态颜色xml(res/color下【没有直接创建目录】) p
  • Android Drawable 那些不为人知的高效用法

    万次阅读 多人点赞 2015-02-26 09:21:13
    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/43752383,...那么什么是Drawable呢?能够在canvas上绘制的一个玩意,而且相比于View,并不需要去考虑measure、layout,仅仅只要去考虑如何draw(c

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 36,861
精华内容 14,744
关键字:

drawable