当你想动态画二维图形,ShapeDrawable对象是可能是你合适的选择.使用ShapeDrawable,你可以随意画出原始的形状并且应用到任何风格.

ShapeDrawable是一个Drawable的派生类,所以你可以用于任何想使用Drawable的地方—比如可能是一个View的背景,通过setBackgroundDrawable()所设置.当然,你也可以把你的形状作为它自己的自定义View绘制,然后以你喜欢的方式添加到你的Layout.因为ShapeDrawable有它自己的draw()方法,你可以创建一个View的子类然后在View.onDraw()的方法中画这个ShapeDrawable.下面是一个简单的View派生类,它仅把ShapeDrawable当作一个View绘出:

[java] public class CustomDrawableView extends View {
private ShapeDrawable mDrawable;

public CustomDrawableView(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) {
mDrawable.draw(canvas);
}
}
public class CustomDrawableView extends View {
private ShapeDrawable mDrawable;

public CustomDrawableView(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) {
mDrawable.draw(canvas);
}
}

在构造函数中,以OvalShape定义了一个ShapeDrawable.然后给它设置了颜色和形状的边界.如果你不设置边界,形状是不会被画出的,如果你不设置颜色,将以黑色画之.
使用自定义View,你可以画任何东西.在上面的例子中,我们可以在一个Activity中用程序随意作画:

[java] CustomDrawableView mCustomDrawableView;

protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mCustomDrawableView = new CustomDrawableView(this);

setContentView(mCustomDrawableView);
}
CustomDrawableView mCustomDrawableView;

protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mCustomDrawableView = new CustomDrawableView(this);

setContentView(mCustomDrawableView);
}

如果你想在XMLlayout中画这个自定义drawable而不是在Activity中,那么这个CustomDrawableView类必须重写View(Context,AttributeSet)构造方法,此方法在从XML初始化一个View时被调用.然后添加一个CustomDrawable元素到XML,像这样:

[html] <com.example.shapedrawable.CustomDrawableView
android:layout_width=”fill_parent”
android:layout_height=”wrap_content”
/>
<com.example.shapedrawable.CustomDrawableView
android:layout_width=”fill_parent”
android:layout_height=”wrap_content”
/>

ShapeDrawable类(就像android.graphics.drawable包中的其它一些Drawable类型)允许你使用公开方法来定义drawable的各种属性.你要调整的一些属性可能有alpha透明,颜色过虑,抖动,opacity和color等.