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 执行效果