一、绘制简单图形
在 Android 中大部分的组件都是 View 的子类,而如果要想进行图形的绘制操作,则可以直接使用一个类继承 View 类,之后覆写 View 类中的指定方法。
· protected void onDraw(Canvas canvas) ;
在之前编写图形界面的时候,都是使用一个个的图形组件,那么这些组件都是一个 View 的子类,可是很多时候需要用户自己构图,例如,在做游戏的时候,这些图形基本上都是没有的。
下面给一个范例:
MyView.java
package com.iflytek.demo; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Paint.Style; import android.graphics.Rect; import android.graphics.RectF; import android.util.AttributeSet; import android.view.View; /** * @author xdwang * * @create 2012-11-11 下午9:19:17 * * @email:[email protected] * * @description 自定义组件 * */ public class MyView extends View { public MyView(Context context, AttributeSet attrs) { super(context, attrs); } @Override protected void onDraw(Canvas canvas) { canvas.drawColor(Color.WHITE); // 设置背景为白色 Paint paint = new Paint(); // ------------1、圆形----------------- paint.setColor(Color.BLUE); // 设置图形的底色 canvas.drawCircle(30, 50, 25, paint);// 从30,50为原点,25为半径画原型 // ------------2、矩形----------------- paint.setColor(Color.BLACK); canvas.drawRect(80, 20, 160, 80, paint); // ------------3、RECT绘制空心矩形----------------- Rect rect = new Rect(); // 定义矩形 rect.set(180, 20, 300, 80); paint.setStyle(Style.STROKE);// 设置空心的 canvas.drawRect(rect, paint); // ------------4、绘制文字----------------- paint.setColor(Color.RED); paint.setTextSize(20); canvas.drawText("xdwangiflytek", 40, 110, paint); // ------------5、绘制直线----------------- paint.setColor(Color.BLACK); canvas.drawLine(10, 120, 300, 120, paint); // ------------6、绘制空心椭圆----------------- RectF oval = new RectF(); oval.set(10.0f, 140.0f, 110.0f, 200.0f); canvas.drawOval(oval, paint); // ------------7、绘制空心扇形----------------- oval = new RectF(); oval.set(150.0f, 140.0f, 210.0f, 200.0f); canvas.drawArc(oval, 150.0f, 140.0f, true, paint); } }
main.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <com.iflytek.demo.MyView android:layout_width="fill_parent" android:layout_height="fill_parent" /> </LinearLayout>
效果图
二、 Bitmap
Android.graphics.Bitmap (位图)是 Android 手机中专门提供的用于操作图片资源的操作类,使用此类可以直接从资源文件之中进行图片资源的读取,并且对这些图片进行一些简单的修改。
Bitmap 类的常用方法:
No. |
方法 |
描述 |
1 |
Public static Bitmap createBitmap(Bitmap src) |
复制一个 Bitmap |
2 |
Public static Bitmap createBitmap(Bitmap source,int x,int y,int width,int height,Matrix m,Boolean filter) |
对一个 Bitmap 进行剪切 |
3 |
Public final int getHeight() |
取得图像的高 |
4 |
Public final int getWidth() |
取得图像的宽 |
5 |
Public static Bitmap createScaledBitmap(Bitmap src,int dstWidth,int dstHeight,boolean filter) |
创建一个指定大小的 Bitmap |
如果要想通过资源文件取得一个 Bitmap 实例,则需要 android.graphics.BitmapFactory 类支持。其方法有:
No. |
方法 |
描述 |
1 |
Public static Bitmap decodeByteArray(byte[] data,int offset,int length) |
根据指定的数据文件创建 Bitmap |
2 |
Public static Bitmap decodeFile(String pathName) |
根据 指定的路径创建 Bitmap |
3 |
Public static Bitmap decodeResource(resources res,int id) |
根据指定的资源创建 Bitmap |
4 |
Public static Bitmap decodeStream(InputStream is) |
根据指定的 InputStream 创建 Bitmap |
范例 MyView.java
package com.iflytek.demo; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.Rect; import android.util.AttributeSet; import android.view.View; /** * @author xdwang * * @create 2012-11-11 下午10:09:44 * * @email:[email protected] * * @description 自定义组件 * */ public class MyView extends View { public MyView(Context context, AttributeSet attrs) { super(context, attrs); } @Override protected void onDraw(Canvas canvas) { // ------------------1、基本绘图--------------------- // Bitmap bitmap = BitmapFactory.decodeResource(super.getResources(), // R.drawable.ic_launcher); // 找到图片的Bitmap对象 // Paint paint = new Paint(); // paint.setAntiAlias(true); // 消除锯齿 // canvas.drawBitmap(bitmap, 0, 0, paint); // paint.setColor(Color.WHITE); // 底色 // paint.setTextSize(20); // canvas.drawText( // "图片高度:" + bitmap.getHeight() + ",图片宽度:" + bitmap.getWidth(), // 10, bitmap.getHeight() + 20, paint); // ------------------2、填充桌面--------------------- // DisplayMetrics dm = super.getResources().getDisplayMetrics(); // int screenWidth = dm.widthPixels; // int screenHeight = dm.heightPixels; // Bitmap bitmap = BitmapFactory.decodeResource(super.getResources(), // R.drawable.ic_launcher); // 找到图片的Bitmap对象 // bitmap = Bitmap.createScaledBitmap(bitmap, screenWidth, screenHeight, // true); // Paint paint = new Paint(); // paint.setAntiAlias(true); // 消除锯齿 // canvas.drawBitmap(bitmap, 0, 0, paint); // ------------------3、指定位置区域显示--------------------- // Bitmap bitmap = BitmapFactory.decodeResource(super.getResources(), // R.drawable.ic_launcher); // 找到图片的Bitmap对象 // Paint paint = new Paint() ; // paint.setAntiAlias(true); // 消除锯齿 // canvas.drawBitmap(bitmap, null, new Rect(30, 50, 200, 200), paint); // ------------------4、图片剪贴--------------------- Bitmap bitmap = BitmapFactory.decodeResource(super.getResources(), R.drawable.ic_launcher); // 找到图片的Bitmap对象 Paint paint = new Paint() ; paint.setAntiAlias(true); // 消除锯齿 canvas.drawBitmap(bitmap, new Rect(10,10,20,20), new Rect(10, 10, 20, 20), paint); } }
Bitmap 最大的特点是可以操作我的二进制数据
三、 Matrix
使用 Bitmap 可以进行图形的绘制,但是如果希望图形可以进行一些平移、旋转、缩放、倾斜等变换的话,则需要使用 android.graphics.Matrix 类(矩阵)的支持。
package com.iflytek.demo; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Matrix; import android.util.AttributeSet; import android.view.View; /** * @author xdwang * * @create 2012-11-11 下午10:22:24 * * @email:[email protected] * * @description 自定义组件 * */ public class MyView extends View { private Bitmap bitmap = null; private Matrix matrix = new Matrix(); public MyView(Context context, AttributeSet attrs) { super(context, attrs); this.bitmap = BitmapFactory.decodeResource(super.getResources(), R.drawable.ic_launcher); // float cosValue = (float) Math.cos(-Math.PI / 3); // float sinValue = (float) Math.sin(-Math.PI / 3); // this.matrix.setValues(new float[] { cosValue, -sinValue, 100, sinValue, // cosValue, 200, 0, 0, 2 }); this.matrix.preScale(0.5f, 0.5f, 50, 100); this.matrix.preRotate(-60, 50, 100); this.matrix.preTranslate(50, 100) ; } @Override protected void onDraw(Canvas canvas) { canvas.drawBitmap(this.bitmap, this.matrix, null); } }