使用(Drawable)资源———ClipDrawable资源

    ClipDrawable代表从其他位图上截取的一个"图片片段"。在XML文件中定义ClipDrawable对象使用<clip.../>元素,该元素的语法为:

<?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"] />

上面的语法格式中可指定如下三个属性:

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

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

     下面以一个示例来说明ClipDrawable对象的用法。

     实例:徐徐展开的风景

     因为ClipDrawable对象可调用setLevel(int level)控制截取图片的部分,因此本示例只要设置一个定时器,让程序不断调用ClipDrawable的setLevel(int level)方法即可实现图片徐徐展开的效果。

     程序先定义如下ClipDrawable对象。

     程序清单my_clip.xml

    

<?xml version="1.0" encoding="utf-8"?>
<clip xmlns:android="http://schemas.android.com/apk/res/android"
    android:drawable="@drawable/shuangta"
    android:clipOrientation="horizontal"
    android:gravity="center" >
</clip>

上面的程序控制从中间开始截取图片,截取方向为水平截取。接下来程序将通过一个定时器来定期修改ClipDrawable对象的level,即可实现图片徐徐展开的效果。

package com.example.studyresources;

import java.util.Timer;
import java.util.TimerTask;

import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.app.Activity;
import android.graphics.drawable.ClipDrawable;
import android.view.Menu;
import android.widget.ImageView;

public class ClipDrawableTest extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_clip_drawable_test);
        ImageView imageView=(ImageView)findViewById(R.id.image);
        //获取图片所显示的ClipDrawable对象
        final ClipDrawable drawable=(ClipDrawable)imageView.getDrawable();
        final Handler handler=new Handler()
        {

            @Override
            public void handleMessage(Message msg) {
                // TODO Auto-generated method stub
                //如果该程序是本程序所发送的
                if(msg.what==0x123)
                {
                    //修改ClipDrawable的level值
                    drawable.setLevel(drawable.getLevel()+200);
                }
            }
        };
        final Timer timer=new Timer();
        timer.schedule(new TimerTask(){

            @Override
            public void run() {
                // TODO Auto-generated method stub
                Message msg=new Message();
                msg.what=0x123;
                //发送消息,通知应用修改ClipDrawable对象的Level值
                handler.sendMessage(msg);
                //取消定时器
                
                if(drawable.getLevel()>=10000)
                {
                    timer.cancel();
                }
            }
        }, 0,300);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.clip_drawable_test, menu);
        return true;
    }

}

运行上面的程序,将看到如图6.6所示的结果。

 

从图6.6所示的运行结果可以看出,通过使用这种徐徐展开的图片,用户会感觉就像进度条一样——实际上,实际应用中完全可以用这种ClipDrawable对象来实现图片进度条。

原文地址:https://www.cnblogs.com/wolipengbo/p/3438944.html