学而实习之 不亦乐乎

Android:ClipDrawable 资源

2022-07-17 10:45:48

ClipDrawable可以根据设置的level值和方向对当前Drawable剪切后显示。它根据level的属性值,决定剪切区域的大小,level的取值范围从0到10000,level为0时完全不显示,为10000时完全显示。

ClipDrawable常用来实现进度条,通过设置不同的level显示不同的进度。

一、使用简介

其 XML 文件根元素为 <clip>,该元素可以指定下列属性:

  • android:drawable:指定截取的源Drawable对象。
  • android:clipOrientation:指定截取方向,可设置水平截取或垂直截取
  • android:gravity:指定截取时的对齐方式。

语法格式:

<?xml version="1.0" encoding="utf-8"?>
<clip xmlns:android="http://schemas.android.com/apk/res/android"
    android:drawable="@drawable/drawable_resource"
    android:clipOrientation["horizontal"|"vertical"]    android:gravity=["top"|"bottom"|"left"|"right"|"center_vertical"|"fill_vertical"|"center_horizontal"|"fill_horizontal"|"center"|"fill"|"clip_vertical"|"clip_horizontal"]
>

元素:
<clip>定义这是个ClipDrawable,必须作为根元素。
android:drawable Drawable资源。 必须。表示该ClipDrawable引用的drawable资源。
android:clipOrientation 裁剪的方向。 horizontal:水平方向 vertical:垂直方向

android:gravity 指定从哪个地方裁剪。必须是下面一个或多个值(多个值之间用”|”分隔)
top 将这个对象放在容器的顶部,不改变其大小,当clipOrientation 是”vertical”,从底部(bottom)开始裁剪
bottom 将这个对象放在容器的底部,不改变其大小。当clipOrientation 是 “vertical”,从顶部(top)开始裁剪
left 将这个对象放在容器的左部,不改变其大小。当clipOrientation 是 “horizontal”,从右边(right)开始裁剪。这也是默认情况。
right 将这个对象放在容器的右部,不改变其大小。当clipOrientation 是 “horizontal”,从左边(left)开始裁剪。
center_vertical 将对象放在垂直中间,不改变其大小。裁剪的情况和”center“一样。
fill_vertical 垂直方向上不发生裁剪。(除非drawable的level是 0,才会不可见,表示全部裁剪完)
center_horizontal 将对象放在水平中间,不改变其大小。裁剪的情况和”center“一样。
fill_horizontal 水平方向上不发生裁剪。(除非drawable的level是 0,才会不可见,表示全部裁剪完)
center 将这个对象放在水平垂直坐标的中间,不改变其大小。当clipOrientation 是 “horizontal”裁剪发生在左右。当clipOrientation是”vertical”,裁剪发生在上下。
fill 填充整个容器,不会发生裁剪。(除非drawable的level是 0,才会不可见,表示全部裁剪完)。
clip_vertical 额外的选项,它能够把它的容器的上下边界,设置为子对象的上下边缘的裁剪边界。裁剪要基于对象垂直重力设置:如果重力设置为top,则裁剪下边,如果设置为bottom,则裁剪上边,否则则上下两边都要裁剪。
clip_horizontal 额外的选项,它能够把它的容器的左右边界,设置为子对象的左右边缘的裁剪边界。裁剪要基于对象垂直重力设置:如果重力设置为right,则裁剪左边,如果设置为left,则裁剪右边,否则则左右两边都要裁剪。
android:gravity需要和android:clipOrientation配合使用,不同的组合,裁剪的效果也不同。

二、实例:动态展开图片

布局文件activity_main.xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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:layout_centerInParent="true"        
      android:src="@drawable/clip"/>
</RelativeLayout>

处理文件MainActivity.java:

public class MainActivity extends Activity {
    private Timer timer;
    private TimerTask timerTask;
    private ClipDrawable clipDrawable;
    
    private Handler handler = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            clipDrawable.setLevel(msg.what);
        }
    };

    @Override    
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ImageView imageview = (ImageView) findViewById(R.id.image);
        clipDrawable = (ClipDrawable) imageview.getDrawable();
        clipDrawable.setLevel(0);

        timer = new Timer();
        timerTask = new TimerTask() {
            @Override
            public void run() {
                if (clipDrawable.getLevel() <= 10000){
                  handler.sendEmptyMessage(clipDrawable.getLevel() + 50);
                }else {
                  if (timer != null) {
                        timer.cancel();
                        timer.purge();
                        timer = null;
                    }
                }
            }
        };
        
        timer.schedule(timerTask, 1000, 50);
    }

    @Override    
    protected void onDestroy() {
        super.onDestroy();
        if (timer != null) {
            timer.cancel();
            timer.purge();
            timer = null;
        }
    }
}