本案例需要自定义一个View 来绘制水平仪的用户界面,首先需要在项目文件夹的src/wyf/ytl 目录下创建一个名为Main-View 的java 类, 并使其继承自View 类, 其代码框架如下:
package wyf.ytl; //声明所在包
import android.content.Context;//引入Context 类
import android.graphics.Bitmap; //引入Bitmap 类
import android.graphics.BitmapFactory; //引入相关类
import android.graphics.Canvas; //引入Canvas 类
import android.graphics.Color; //引入Color 类
import android.graphics.Paint; //引入Paint 类
import android.graphics.RectF; //引入RectF 类
import android.graphics.Paint.Style; //引入Style 类
import android.util.AttributeSet; //引入AttributeSet 类
import android.view.View; //引入View 类
public class MainView extends View{
Paint paint = new Paint(); //画笔
//图片资源的声明
Bitmap shangBitmap1; //上面的大矩形图
Bitmap shangBitmap2; //上面的气泡
Bitmap zuoBitmap1; //左面的大矩形图
Bitmap zuoBitmap2; //左面图的气泡
Bitmap zhongBitmap1; //中间的大圆图
Bitmap zhongBitmap2; //中间的小气泡
Bitmap xiaBitmap1; //右下的矩形图
Bitmap xiaBitmap2; //右下的气泡
//背景矩形的位置声明
int shang1_X = 60; //上面的大矩形图
int shang1_Y = 12;
int zuo1_X = 12; //左面的大矩形图
int zuo1_Y = 60;
int zhong1_X = 65; //中间的大圆图
int zhong1_Y = 65;
int xia1_X = 145; //右下的矩形图
int xia1_Y = 145;//水泡的位置声明
int shang2_X; //上面的气泡XY 坐标
int shang2_Y;
int zuo2_X; //左面图的气泡XY 坐标
int zuo2_Y;
int zhong2_X; //中间的小气泡XY 坐标
int zhong2_Y;
int xia2_X; //右下的气泡XY 坐标
int xia2_Y;
public MainView(Context context, AttributeSet attrs){
super(context, attrs);
initBitmap(); //初始化图片资源
initLocation(); //初始化气泡的位置
}
private void initBitmap(){ //初始化图片的方法
…//该处省略了部分代码,将在后面进行介绍
}
private void initLocation(){ //初始化气泡位置的方法
…//该处省略了部分代码,将在后面进行介绍
}
@Override
protected void onDraw(Canvas canvas){//重写的绘制方法
super.onDraw(canvas);
…//该处省略了部分代码,将在后面进行介绍
}
}
上述代码中的initBitmap 以及initLocation 方法是对界面进行初始化方法, 而onDraw 方法会根据需要绘制整个界面。
MainView 类构造器中调用了两个单独的方法对整个界面进行了初始化, 这是一种非常好的编程习惯。因为把不同功能的代码各自编写成独立的方法可以使主逻辑清晰, 且各个方法中的代码都不是很长, 会大大提高代码的可读性以及可维护性。
完成了代码框架的开发后就可以对其中各个方法进行开发了, 首先开发的是图片资源的初始化方法, 其代码如下:
private void initBitmap(){ //初始化图片资源的方法
shangBitmap1 = BitmapFactory.decodeResource(getResources(), R.drawable.shang1);
shangBitmap2 = BitmapFactory.decodeResource(getResources(), R.drawable.shang2);
zuoBitmap1 = BitmapFactory.decodeResource(getResources(), R.drawable.zuo1);
zuoBitmap2 = BitmapFactory.decodeResource(getResources(), R.drawable.zuo2);
zhongBitmap1 = BitmapFactory.decodeResource(getResources(), R.drawable.zhong1);
zhongBitmap2 = BitmapFactory.decodeResource(getResources(), R.drawable.zhong2);
xiaBitmap1 = BitmapFactory.decodeResource(getResources(), R.drawable.xia1);
xiaBitmap2 = BitmapFactory.decodeResource(getResources(), R.drawable.xia2);
}
上述代码为initBitmap 方法的全部代码, 其作用是对程序中所有的图片资源进行初始化, 在开发该方法之前, 应该确保所有的图片资源已经存放到了指定的目录下。
完成了图片资源初始化方法的开发后, 便可对气泡位置初始化方法initLocation 进行开发了, 其代码如下:
private void initLocation(){ //初始化气泡位置的方法
shang2_X = shang1_X + shangBitmap1.getWidth()/2- shangBitmap2.getWidth()/2;
shang2_Y = shang1_Y + shangBitmap1.getHeight()/2- shangBitmap2.getHeight()/2;
zuo2_X = zuo1_X + zuoBitmap1.getWidth()/2- zuoBitmap2.getWidth()/2;
zuo2_Y = zuo1_Y + zuoBitmap1.getHeight()/2- zuoBitmap2.getHeight()/2;
zhong2_X = zhong1_X + zhongBitmap1.getWidth()/2- zhongBitmap2.getWidth()/2;
zhong2_Y = zhong1_Y + zhongBitmap1.getHeight()/2- zhongBitmap2.getHeight()/2;
xia2_X = xia1_X + xiaBitmap1.getWidth()/2- xiaBitmap2.getWidth()/2;
xia2_Y = xia1_Y + xiaBitmap1.getHeight()/2- xiaBitmap2.getHeight()/2;
}
在该方法中通过相应图片的宽度和高度动态计算气泡的初始坐标, 采用此方法动态计算气泡坐标的好处是当日后更改图片资源后, 不需要重写修改源代码即可正常运行, 大大提高了程序的可维护性。
在完成了各个初始化方法的开发后就可以对绘制方法onDraw 进行开发, 该方法主要负责界面的绘制工作, 其代码如下:
@Override
protected void onDraw(Canvas canvas){//界面绘制方法super.onDraw(canvas);
canvas.drawColor(Color.WHITE); //设置背景色为白色
paint.setColor(Color.BLUE); //设置画笔颜色
paint.setStyle(Style.STROKE); //设置画笔为不填充
canvas.drawRect(5, 5, 315, 315, paint);//绘制外边框矩形
//画背景矩形
canvas.drawBitmap(shangBitmap1, shang1_X,shang1_Y, paint); //上
canvas.drawBitmap(zuoBitmap1, zuo1_X,zuo1_Y, paint); //左
canvas.drawBitmap(zhongBitmap1, zhong1_X,zhong1_Y, paint); //中
canvas.drawBitmap(xiaBitmap1, xia1_X,xia1_Y, paint); //下
//开始绘制气泡
canvas.drawBitmap(shangBitmap2, shang2_X,shang2_Y, paint); //上
canvas.drawBitmap(zuoBitmap2, zuo2_X,zuo2_Y, paint); //左
canvas.drawBitmap(zhongBitmap2, zhong2_X,zhong2_Y, paint); //中
canvas.drawBitmap(xiaBitmap2, xia2_X, xia2_Y, paint);//下
paint.setColor(Color.GRAY);//设置画笔颜色用来绘制刻度
评论
查看更多