Android游戏开发技术实战详解
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

4.3 Paint类绘制图像

Paint类的完整写法是Android.Graphics. Paint,它的厉害之处是可以设置画笔和画刷的属性。在Paint类中最著名的是下面的几个方法。

· void reset():实现重置功能;

· void setARGB(int a, int r, int g, int b)或void setColor(int color):均设置Paint对象的颜色;

· void setAntiAlias(boolean aa):是否抗锯齿,需要配合void setFlags (Paint.ANTI_ ALIAS_FLAG) 来帮助消除锯齿使其边缘更平滑;

· Shader setShader(Shader shader):设置阴影,Shader类是一个矩阵对象,如果为NULL将清除阴影;

· void setStyle(Paint.Style style):设置样式,一般为Fill填充,或者STROKE凹陷效果;

· void setTextSize(float textSize):设置字体大小;

· void setTextAlign(Paint.Align align):文本对齐方式;

· Typeface setTypeface(Typeface typeface):用于设置字体,通过Typeface可以加载Android内部的字体,对于中文来说一般为宋体,我们可以根据需要来自己添加部分字体,如雅黑等。

· void setUnderlineText(boolean underlineText):表示是否设置下画线。

实例4-2 使用Color类和Paint类实现绘图处理(daima\4\PaintCH)。

本实例是通过类Paint和Color联合完成的,但是Paint在此例中发挥的作用更大。本实例的具体实现流程如下所示。

step 1 编写布局文件main.xml,具体代码如下所示。

<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:orientation="vertical"
    Android:layout_width="fill_parent"
    Android:layout_height="fill_parent"
    >
<TextView
    Android:layout_width="fill_parent"
    Android:layout_height="wrap_content"
    Android:text="@string/hello"
    />
</LinearLayout>

step 2 编写文件Activity.java,通过“mGameView = new GameView(this)”,用Activity类的setContentView方法来设置要显示的具体View类。文件Activity.java的主要代码如下所示。

public class Activity01 extends Activity
{
  @Override
  public void onCreate(Bundle savedInstanceState)
  {
      super.onCreate(savedInstanceState);
      mGameView = new GameView(this);
      setContentView(mGameView);
  }
}

step 3 编写文件PaintCH.java来绘制一个指定的图形,主要实现代码如下所示。

/* 声明Paint对象 */
private Paint mPaint   = null;
public draw(Context context)
{
    super(context);
    /* 构建对象 */
    mPaint = new Paint();
    /* 开启线程 */
    new Thread(this).start();
}
public void onDraw(Canvas canvas)
{
    super.onDraw(canvas);
    /* 设置Paint为无锯齿 */
    mPaint.setAntiAlias(true);
    /* 设置Paint的颜色 */
    mPaint.setColor(Color.WHITE);
    mPaint.setColor(Color.BLUE);
    mPaint.setColor(Color.YELLOW);
    mPaint.setColor(Color.GREEN);
    /* 同样是设置颜色 */
    mPaint.setColor(Color.rgb(255, 0, 0));
    /* 提取颜色 */
    Color.red(0xcccccc);
    Color.green(0xcccccc);
    /* 设置Paint的颜色和Alpha值(a,r,g,b) */
    mPaint.setARGB(255, 255, 0, 0);
    /* 设置Paint的Alpha值 */
    mPaint.setAlpha(220);
    /* 这里可以设置为另外一个Paint对象 */
    // mPaint.set(new Paint());
    /* 设置字体的尺寸 */
    mPaint.setTextSize(14);
    // 设置Paint的风格为“空心”
    // 当然也可以设置为“实心”(Paint.Style.FILL)
    mPaint.setStyle(Paint.Style.STROKE);
    // 设置“空心”的外框的宽度。
    mPaint.setStrokeWidth(5);
    /* 得到Paint的一些属性 */
    Log.i(TAG, "paint的颜色:" + mPaint.getColor());
    Log.i(TAG, "paint的Alpha:" + mPaint.getAlpha());
    Log.i(TAG, "paint的外框的宽度:" + mPaint.getStrokeWidth());
    Log.i(TAG, "paint的字体尺寸:" + mPaint.getTextSize());
    /* 绘制一个矩形 */
    // 肯定是一个空心的矩形
    canvas.drawRect((320 - 80) / 2, 20, (320 - 80) / 2 + 80, 20 + 40, mPaint);
    /* 设置风格为实心 */
    mPaint.setStyle(Paint.Style.FILL);
    mPaint.setColor(Color.GREEN);
    /* 绘制绿色实心矩形 */
    canvas.drawRect(0, 20, 40, 20 + 40, mPaint);
}
//触笔事件
public boolean onTouchEvent(MotionEvent event)
{
    return true;
}
//按键按下事件
public boolean onKeyDown(int keyCode, KeyEvent event)
{
    return true;
}
//按键弹起事件
public boolean onKeyUp(int keyCode, KeyEvent event)
{
    return false;
  }
  public boolean onKeyMultiple(int keyCode, int repeatCount, KeyEvent event)
  {
    return true;
  }
  public void run()
  {
    while (!Thread.currentThread().isInterrupted())
    {
        try
        {
            Thread.sleep(100);
        }
        catch (InterruptedException e)
        {
            Thread.currentThread().interrupt();
        }
        // 使用postInvalidate可以直接在线程中更新界面
        postInvalidate();
    }
  }
}

执行后的效果如图4-2所示。

图4-2 执行效果