ZetCode

Android 中的绘图

最后修改于 2012 年 10 月 29 日

在本章 Android 开发教程中,我们将进行一些绘图。Android 框架 API 提供了 2D 绘图 API,允许渲染自定义图形。

我们可以直接在 `Canvas` 对象上绘图,或者修改现有的 View 来定制其外观和感觉。绘图在 `onDraw()` 方法中进行。简单的图形也可以在布局 XML 文件中创建。

我们使用 `Canvas` 对象进行绘图。`Canvas` 是一个具有绘图方法的对象,用于进行绘图。实际的绘图发生在放置在窗口中的 `Bitmap` 中。`Paint` 类保存了有关如何绘制几何图形、文本和位图的样式和颜色信息。`Drawable` 是一个可以被绘制的对象。与 `View` 不同,`Drawable` 没有接收事件或与用户交互的任何设施。

椭圆形

我们将要在 `View` 上绘制一个圆。该圆在 XML 文件中定义。无需修改清单文件。

oval.xml
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="oval">
    
   <solid 
       android:color="#666666"/>
   <size 
       android:width="70dp"
       android:height="70dp"/>
</shape> 

在 `oval.xml` 文件中,我们创建一个圆形。我们定义它的颜色和大小。`oval.xml` 文件位于 `res/drawable` 目录下。该目录需要被创建。

main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >        

<View
    android:layout_width="100dp"
    android:layout_height="100dp"
    android:layout_marginTop="5dp"
    android:background="@drawable/oval"
    />   
   
</LinearLayout>

在 `main.xml` 文件中,我们定义了一个 `View`。这个 View 的背景会填充我们的可绘制对象。

strings.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="app_name">OvalShape</string>
</resources>

资源文件。

MainActivity.java
package com.zetcode.ovalshape;

import android.app.Activity;
import android.os.Bundle;

public class MainActivity extends Activity
{
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }
}

该文件只是加载了定义的布局。

Oval Shape
图:椭圆形

绘制矩形

在第二个示例中,我们将在 `View` 上绘制一个矩形。它将在 `View` 的 `onDraw()` 方法中绘制。由于我们将在现有的 `View` 上绘图,我们将有一个预定义的 `Canvas` 及其 `Bitmap`。我们无需担心它们。清单文件未被修改。在此示例中,将不需要 `main.xml` 文件。

strings.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="app_name">DrawRect</string>
</resources>

资源。

DrawView.java
package com.zetcode.drawrect;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.view.View;

public class DrawView extends View 
{
    Paint paint = new Paint();

    public DrawView(Context context)  
    {
        super(context);
        paint.setColor(Color.GREEN);
    }

    @Override
    public void onDraw(Canvas canvas) 
    {
        canvas.drawRect(30, 30, 100, 100, paint);
    }
}

我们有一个自定义的 `DrawView` 类。该文件位于 `src/com/zetcode/drawrect/` 目录下。

public class DrawView extends View 

自定义 `DrawView` 类继承自基础 `View` 类。

Paint paint = new Paint();

创建了一个 `Paint` 类的实例。它将定义绘图的颜色。

paint.setColor(Color.GREEN);

我们将以绿色绘制。

@Override
public void onDraw(Canvas canvas) 
{
    canvas.drawRect(30, 30, 100, 100, paint);
}

绘图在 `onDraw()` 方法中进行。该方法为我们提供了 `Canvas` 对象。我们调用 `drawRect()` 方法在 View 上绘制矩形。

MainActivity.java
package com.zetcode.drawrect;

import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;

public class MainActivity extends Activity 
{
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);

        DrawView drawView = new DrawView(this);
        drawView.setBackgroundColor(Color.WHITE);
        setContentView(drawView);
    }
}

在 `MainActivity.java` 源文件中,我们将自定义的 `DrawView` 设置为 `Activity` 的内容 View。

DrawView drawView = new DrawView(this);

我们创建了一个 `DrawView` 类的实例。

drawView.setBackgroundColor(Color.WHITE);

我们为 `View` 指定了背景颜色。

setContentView(drawView);

`DrawView` 成为 `Activity` 的内容 `View`。

Rectangle
图:矩形

在本章 Android 开发教程中,我们进行了一些基础绘图。