Drawable解析2——GradientDrawable、ShapeDrawable、InsetDrawable和RotateDrawable

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
简介: 继承上一节,这一节接着说四个子类1、GradientDrawable表示一个渐变区域,可以实现线性渐变、发散渐变、和平铺渐变。
继承上一节,这一节接着说四个子类
1、GradientDrawable表示一个渐变区域,可以实现线性渐变、发散渐变、和平铺渐变。GradientDrawable使用shape作为根节点创建xml文件,文档节点结构如下:
<?xml version="1.0" encoding="utf-8"?>
<size/>    //定义区域的大小
<gradient/>    //设置区域背景的渐变效果
<soild/>    //设置区域背景的背景颜色,如果设置了soild则会覆盖fradient的效果
<stroke/>    //设置区域的边框效果
<padding/>    //设置区域的内边距

看下各个节点的属性


下面用xml定义三个效果

  • 线性渐变效果gradient_linear.xml
 
  
<?xml version="1.0" encoding="utf-8"?>
    android:shape="oval" >

    <gradient
        android:type="linear"
        android:angle="90"
        android:centerColor="#00ff00"
        android:endColor="#0000ff"
        android:startColor="#ff0000" />

    <stroke
        android:dashGap="5dip"
        android:dashWidth="4dip"
        android:width="3dip"
        android:color="#fff" />

</shape>

  • 发散渐变效果gradient_radial.xml
<?xml version="1.0" encoding="utf-8"?>
    android:innerRadius="0dp"
    android:shape="ring"
    android:thickness="70dp"
    android:useLevel="false" >

    <gradient
        android:centerColor="#00ff00"
        android:endColor="#0000ff"
        android:gradientRadius="70"
        android:startColor="#ff0000"
        android:type="radial"
        android:useLevel="false" />

</shape>

  • 平铺渐变效果gradient_sweep.xml
<?xml version="1.0" encoding="utf-8"?>
    android:innerRadiusRatio="8"
    android:shape="ring"
    android:thicknessRatio="3"
    android:useLevel="false"
    >

    <gradient
        android:centerColor="#00ff00"
        android:endColor="#0000ff"
        android:startColor="#ff0000"
        android:type="sweep"
        android:useLevel="false"
         />
</shape>

使用效果如下:

2、ShapeDrawable可以说就是GradientDrawable的孪生兄弟,唯一的不同就是ShapeDrawable没有gradient属性节点,它用来定义基本的几何图形,如矩形,圆形,线条等。怎么使用就参照GradientDrawable的用法就行了,这里就不详细说明了。

3、下面再说下InsetDrawable。InsetDrawable表示把一个Drawable嵌入到另外一个Drawable的内部,并且在内部留一些间距, 这一点很像Drawable的padding属性,区别在于padding表示的是Drawable的内容与Drawable本身的边距, 而InsetDrawable表示的是两个Drawable与容器之间的边距。当控件需要的背景比实际的边框小的时候,比较适合使用InsetDrawable,比如使用这个可以解决我们自定义Dialog与屏幕之间 的一个间距问题,相信做过的朋友都知道,即使我们设置了layout_margin的话也是没用的,这个 时候就可以用到这个InsetDrawable了!只需为InsetDrawable设置一个insetXxx设置不同方向的边距,然后为设置为Dialog的背景即可!在xml文件中使用inset作为根节点定义InsetDrawable。

看下inset的节点属性

定义一个inset.xml
<?xml version="1.0" encoding="utf-8"?>

<inset
    android:drawable="@drawable/ic_launcher"
    android:insetTop="10dip"
    android:insetRight="10dip"
    android:insetBottom="10dip"
    android:insetLeft="10dip" />

在java类中如下调用
ImageView imageView=(ImageView) findViewById(R.id.imageView4);
        XmlResourceParser xrp =getResources().getXml(R.drawable.inset);
        try {
            Drawable drawable = Drawable.createFromXml(getResources(), xrp);
            InsetDrawable insetDrawable = new InsetDrawable(drawable, 10, 10, 10, 10); 
            imageView.setBackground(insetDrawable);
        } catch (XmlPullParserException e) {
           
            e.printStackTrace();
        } catch (IOException e) {
            
            e.printStackTrace();
        }

4、RotateDrawable用来对一个Drawable进行旋转操作,它会根据level属性控制旋转的角度,也可以设置他在容器中的对齐方式,在xml文件中使用rotate作为根节点进行定义,相关属性如下:

旋转时,顺时针为正,逆时针为负值,看下它的旋转角度

定义一个rotateDrawable资源文件:
<?xml version="1.0" encoding="utf-8"?>
<rotatexmlns:android="http://schemas.android.com/apk/res/android"
android:drawable="@mipmap/ic_launcher"
android:fromDegrees="-180"
android:pivotX="50%"
android:pivotY="50%"/>

在activity_main.xml中定义一个ImageView,使用android:src指向上述drawable即可,这点和ClipDrawable一样,在java类中,我使用了一个Seekbar来改变level值
ImageView imageview4 = (ImageView) findViewById(R.id.iv_main_rotate);
        // 获取图片所显示的ClipDrawable对象
        final RotateDrawable drawable = (RotateDrawable) imageview4.getDrawable();
        SeekBar seekBar = (SeekBar) findViewById(R.id.seekBar);
        seekBar.setMax(10000);
        seekBar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {

            public void onStopTrackingTouch(SeekBar seekBar) {
            }

            public void onStartTrackingTouch(SeekBar seekBar) {
            }

            public void onProgressChanged(SeekBar seekBar, int progress,
                    boolean fromUser) {
                drawable.setLevel(progress);
            }

        });

源代码

参考:

http://www.runoob.com/w3cnote/android-tutorial-drawable2.html

相关文章
|
XML Java Android开发
Drawable解析3——LayerDrawable、TransitionDrawable、NinePatchDrawable和LevelListDrawabl
1、前两节我们已经说了8个Drawable了,本节继续,第一个,LayerDrawable,表示层图形对象。LayerDrawable用于管理一组drawable,每个drawable处于不同的层,当绘制时会按照顺序将其全部绘制到画布上。
1049 0
|
XML Android开发 数据格式
Drawable解析4——StateListDrawable和AnimationDrawable
1、估计StateListDrawable是大家用的最多一个drawable了,所有的控件背景基本上都使用了StateListDrawable,以实现其在不同状态下显示不同的效果,例如按钮的按下、选中、默认、禁用等多种模式状态。
981 0
|
XML Java Android开发
Drawable解析1——ColorDrawable、BitmapDrawable、ClipDrawabl和ScaleDrawable
Drawable资源是Android应用中使用最广泛的资源,它不仅可以使用各种格式的图片资源,也可以使用多种xml文件资源。
916 0
|
15天前
|
机器学习/深度学习 缓存 算法
netty源码解解析(4.0)-25 ByteBuf内存池:PoolArena-PoolChunk
netty源码解解析(4.0)-25 ByteBuf内存池:PoolArena-PoolChunk
|
17天前
|
XML Java 数据格式
深度解析 Spring 源码:从 BeanDefinition 源码探索 Bean 的本质
深度解析 Spring 源码:从 BeanDefinition 源码探索 Bean 的本质
25 3
|
2天前
|
存储 安全 Java
深度长文解析SpringWebFlux响应式框架15个核心组件源码
以上是Spring WebFlux 框架核心组件的全部介绍了,希望可以帮助你全面深入的理解 WebFlux的原理,关注【威哥爱编程】,主页里可查看V哥每天更新的原创技术内容,让我们一起成长。
|
3天前
|
关系型数据库 分布式数据库 数据库
PolarDB-X源码解析:揭秘分布式事务处理
【7月更文挑战第3天】**PolarDB-X源码解析:揭秘分布式事务处理** PolarDB-X,应对大规模分布式事务挑战,基于2PC协议确保ACID特性。通过预提交和提交阶段保证原子性与一致性,使用一致性快照隔离和乐观锁减少冲突,结合故障恢复机制确保高可用。源码中的事务管理逻辑展现了优化的分布式事务处理流程,为开发者提供了洞察分布式数据库核心技术的窗口。随着开源社区的发展,更多创新实践将促进数据库技术进步。
11 3
|
9天前
|
NoSQL Java Redis
【源码解析】自动配置的这些细节都不知道,别说你会 springboot
【源码解析】自动配置的这些细节都不知道,别说你会 springboot
|
16天前
|
存储 NoSQL 算法
Redis(四):del/unlink 命令源码解析
Redis(四):del/unlink 命令源码解析
|
17天前
|
XML Java 数据格式
深度解析 Spring 源码:揭秘 BeanFactory 之谜
深度解析 Spring 源码:揭秘 BeanFactory 之谜
20 1

推荐镜像

更多