• android drawable 应用


    Android SDK提供了一个强大的类Drawable,Drawable这个抽象类到底代表了什么,如何使用?Drawable是个很抽象的概念,通过简单的例子程序来学习它,理解它。先看个简单的例子,使用Drawable的子类ShapeDrawable来画图,如下:
    public class testView extends View {
    private ShapeDrawable mDrawable;
    public testView(Context context) {
    super(context);
    int x = 10;
    int y = 10;
    int width = 300;
    int height = 50;
    mDrawable = new ShapeDrawable(new OvalShape());
    mDrawable.getPaint().setColor(0xff74AC23);
    mDrawable.setBounds(x, y, x + width, y + height);
    }
    protected void onDraw(Canvas canvas)
    super.onDraw(canvas);
    canvas.drawColor(Color.WHITE);//画白色背景
    mDrawable.draw(canvas);
    }
    }
    程序的运行结果,显示如下:

    ShapDrawable 简要解析:
    1. 创建一个OvalShape(一个椭圆);
    2. 使用刚创建的OvalShape构造一个ShapeDrawable对象mDrawable
    3. 设置mDrawable的颜色;
    4. 设置mDrawable的大小;
    5. 将mDrawable画在testView 的画布上;

    这个简单的例子可以帮我们理解什么是Drawable,Drawable就是一个可画的对象,其可能是一张位图(BitmapDrawable),也可能是一个图形(ShapeDrawable),还有可能是一个图层(LayerDrawable),我们根据画图的需求,创建相应的可画对象,就可以将这个可画对象当作一块“画布(Canvas)”,在其上面操作可画对象,并最终将这种可画对象显示在画布上,有点类似于“内存画布“。

    上面只是一个简单的使用Drawable的例子,完全没有体现出Drawable的强大功能。Android SDK中说明了Drawable主要的作用是:在XML中定义各种动画,然后把 XML当作Drawable资源来读取,通过Drawable显示动画。下面举个使用TransitionDrawable 的例子,创建一个Android工程,然后再这个工程的基础上修改,修改过程如下:
    1、去掉layout/main.xml中的TextView,增加ImagView,如下:
    <ImageView
    android:layout_width=”wrap_content”
    android:layout_height=”wrap_content”
    android:tint=”#55ff0000″
    android:src=”@drawable/my_image”/>

    2、创建一个XML文件,命名为expand_collapse.xml,内容如下:
    <?xml version=”1.0″ encoding=”UTF-8″?>
    <transition xmlns:android=”http://schemas.android.com/apk/res/android”>
    <item android:drawable=”@drawable/image_expand”/>
    <item android:drawable=”@drawable/image_collapse”/>
    </transition>
    需要3张png图片,存放到res\drawable目录下,3张图片分别命名为:my_image.png、image_expand.png、image_collapse.png。

    3、修改Activity中的代码,内容如下:
    LinearLayout mLinearLayout;
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    mLinearLayout = new LinearLayout(this);
    ImageView i = new ImageView(this);
    i.setAdjustViewBounds(true);
    i.setLayoutParams(new Gallery.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
    mLinearLayout.addView(i);
    setContentView(mLinearLayout);
    Resources res = getResources();
    TransitionDrawable transition =
    (TransitionDrawable) res.getDrawable(R.drawable.expand_collapse);
    i.setImageDrawable(transition);
    transition.startTransition(10000);
    }

    4、如果修改的没有错误,运行程序,结果显示如下:
    初始图片
    TransitionDrawable-begin
    过渡中的图片
    TransitionDrawable-mid
    最后的图片
    TransitionDrawable-end

    屏幕上动画显示的是: 从图片image_expand.png过渡到image_collapse.png,也就是我们在expand_collapse.xml中定义的一个transition动画。看完这个例子,你对Drawable的理解是否又深入些?这里提供这个程序的源代码,供大家下载,可以在这个例子的基础上去体会其他的Drawable,来加深对Drawable的理解。

    1、图片资源

    图片资源是最简单的Drawable资源,只要把*.png、*.jpg*、.gif等格式的图片放入/res/drawable-XXX目录下,Android SDK就会在编译应用自动加载该图片,并在R资源清单类中生成该资源的引用。

    Android不允许图片资源的文件名中出现大写字母,且不能以数字开头。

    java中访问资源:[<package>.]R.drawable.<file_name>

    XML中访问资源:@[<package_name:>]drawable/file_name

    为了在程序中获得实际的Drawable对象,Resources提供了Drawable getDrawable(int id)方法,该方法跟据Drawable资源在R清单类中的ID获取实际的Drawable对象。

    2、StateListDrawable资源

    StateListDrawable用于组织多个Drawable对象。当使用StateListDrawable作为目标组件的背景、前景图片时,StateListDrawable对象所显示的Drawable对象会随目标组件形态的改变而自动切换。

    定义StateListDrawable对象的XML文件的根元素为<selector../>,该元素可包含多个<item.../>元素,该元素可指定如下属性:

    android:color或android:drawable:指定颜色或drawable对象

    android:state_xxx:指定一个特定状态

    3、LayerDrawable资源

    与StateListDrawable有点类似,LayerDrawable也可以包含一个Drawable数组,因此系统将会按这些Drawable对象的数组顺序来绘制它们,索引最大的Drawable对象将会被绘制在最上面。

    定义LayerDrawable对象的XML文件的根元素为<layer-list.../>,该元素可以包含多个<item.../>元素,该元素可指定如下属性:

    android:drawable:指定作为LayerDrawable元素之一的Drawable对象。

    android:id:为该Drawable对象指定一个标识

    android:buttom|top|button:它们用于指定一个长度值,用于指定将该Drawable对象绘制到目标组件的指定位置

    4、ShapeDrawable资源

    ShapeDrawable用于定义一个基本的几何图形(如矩形、圆形、线条等),定义ShapeDrawable的XML文件的根元素是<shape.../>元素,该元素可指定如下属性:

    android:shape=["rectangle"|"Oval"|"line"|"ring"]:指定定义哪种类型的几何图形

    5、ClipDrawable资源

    ClipDrawable代表从其它位图上截取的一个“图片片段”。在XML文件中定义ClipDrawable对象使用<clip.../>元素。

    可指定如下三个属性:

    android:drawable:指定截取的源Drawable对象

    android:clipOrientation:指定截取方向,可设置水平截取或垂直截取

    android:gravity:指定截取时的对齐方式

    使用ClipDrawable对象可调用setLevel(int level)方法来设置截取的区域大小。当Level为0时,截取的图片片段为空,当Level为10000时,截取整张图片。

    6、AnimationDrawable资源

    AnimationDrawable代表一个动画。定义补间动画的XML资源文件以<set.../>元素作为根元素,该元素内可以指定如下4个元素:

    alpha:设置透明度的改变

    scale:设置图片进行缩放改变

    translate:设置图片进行位移变换

    rotate:设置图片进行旋转

    定义动画的XML资源应该放在/res/anim路径下,当使用ADT创建一个Android应用时,默认不会包含该路径,开发者需要自行创建该路径。

    定义补间动画的思路很简单:设置一张图片的开始状态(包括透明度、位置、缩放比、旋转度)、并设置图片的结束状态(包括透明度、位置、缩放比、旋转度),再设置动画的持续时间,Android系统会使用动画效果把这张图片从开始状态变换到结束状态。

    在java代码中访问动画资源文件:[<package>.]R.anim.<file_name>

    在XML文件中访问动画资源文件:@[<package_name>:]anim/file_name

    为了在java代码中获取实际的Animation对象,可以调用AnimationUtils的如下方法:loadAnimation(Context ctx,int resld)

  • 相关阅读:
    浏览器—CORS 通信的学习总结
    前端算法
    移动端适配时对meta name="viewport" content="width=device-width,initial-scale=1.0"的理解
    react和vue的区别
    对xss攻击和csrf攻击的理解
    前端如何解决跨域
    你没那么重要
    五福
    天道
    决策
  • 原文地址:https://www.cnblogs.com/renyuan/p/2662279.html
Copyright © 2020-2023  润新知