做自定义view时遇到的问题还有如何解决的:
http://blog.csdn.net/suren__123/article/details/8065992
由于要实现联想存储器用于识别数字,所以想到做一个自定义的SurfaceView类用于输入输出
效果如下图所示,可以利用手写输入图像并转换为二位数组
也可以把二维数组的图像显示出来...
程序源代码如下:
public class NumView extends SurfaceView implements Runnable,Callback, android.view.SurfaceHolder.Callback{
private static final String TAG="NumView";
SurfaceHolder holder = null;
//SurfaceView的几个属性
int left,right,top,bottom = 0;
int screenWidth,screenHeight = 0;
int height,width = 0;
int dHeight,dWidth = 0;
int row = 6;
int col = 5;
//是否允许用户输入
boolean allowIn = true;
double flag = 0;
//当前的二维数组
public double[][] arry = new double[row][col];
//重要的构造方法
public NumView(Context context,AttributeSet attrs) {
super(context,attrs);
// TODO Auto-generated constructor stub
holder=this.getHolder();
holder.addCallback(this);
this.setFocusable(true);
Log.v("NumViewIn","1");
}
public NumView(Context context) {
super(context);
// TODO Auto-generated constructor stub
holder=this.getHolder();
holder.addCallback(this);
this.setFocusable(true);
Log.v("NumViewIn","2");
}
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
// TODO Auto-generated method stub
Log.v("SurfaceChanged","1");
}
//可以理解为初始化成功时调用
public void surfaceCreated(SurfaceHolder holder) {
// TODO Auto-generated method stub
Log.v("SurfaceCreat","1");
screenWidth = this.getWidth();
screenHeight = this.getHeight();
left = this.getLeft();
right = this.getRight();
top = this.getTop();
bottom = this.getBottom();
height = this.getHeight();
width = this.getWidth();
dHeight = height/row;
dWidth = width/col;
//显示数组
drawArry();
}
public void surfaceDestroyed(SurfaceHolder holder) {
// TODO Auto-generated method stub
Log.v("SurfaceDestroyed","1");
}
//初始化数组大小
public void setRowCol(int row,int col){
this.row = row;
this.col = col;
this.arry = new double[row][col];
for(int i = 0 ; i < row ; i++){
for(int j = 0 ; j < col ; j++){
arry[i][j] = -1;
}
}
}
//设置是否允许用户输入
public void setAllowIn(boolean allowIn){
this.allowIn = allowIn;
}
//清屏
public void clear(){
for(int i = 0 ; i < row ; i++){
for(int j = 0 ; j < col ; j++){
arry[i][j] = -1;
}
}
drawArry();
}
public double[][] getArry(){
return arry;
}
public void setArry(double[][] arry1,int row1,int col1){
arry = arry1;
row = row1;
col = col1;
}
public void drawArry(){
if(holder == null){
return;
}
//获得canvas对象
Canvas canvas = holder.lockCanvas();
if(canvas == null){
Log.v("draw","Canvas == null");
return;
}
//清空屏幕
canvas.drawColor(Color.WHITE);
Paint paint = new Paint();
paint.setColor(Color.BLACK);
paint.setStyle(Paint.Style.FILL);
//canvas.drawRect(10, 10, 20, 20, paint);
//画出图像
for(int i = 0;i < row; i++){
for(int j = 0;j < col; j++){
if(arry[i][j] == 1){
canvas.drawRect(j*dWidth, i*dHeight, (j+1)*dWidth, (i+1)*dHeight, paint);
}
}
}
//画出网格
paint.setColor(Color.GRAY);
//画行
for(int i = 0;i <= row + 1; i++){
canvas.drawLine(0, i*dHeight, width, i*dHeight, paint);
}
//画列
for(int i = 0;i <= col + 1; i++){
canvas.drawLine(i*dWidth, 0, i*dWidth, height, paint);
}
//释放canvas对象
holder.unlockCanvasAndPost(canvas);
}
public void drawArry(double[][] arry){
if(holder == null){
return;
}
this.arry = arry;
Log.v("draw",String.valueOf(this.arry));
//获得canvas对象
Canvas canvas = holder.lockCanvas();
//清空屏幕
canvas.drawColor(Color.WHITE);
Paint paint = new Paint();
paint.setColor(Color.BLACK);
paint.setStyle(Paint.Style.FILL);
//canvas.drawRect(10, 10, 20, 20, paint);
//画出图像
for(int i = 0;i < row; i++){
for(int j = 0;j < col; j++){
if(this.arry[i][j] == 1){
canvas.drawRect(j*dWidth, i*dHeight, (j+1)*dWidth, (i+1)*dHeight, paint);
}
}
}
//画出网格
paint.setColor(Color.GRAY);
//画行
for(int i = 0;i <= row + 1; i++){
canvas.drawLine(0, i*dHeight, width, i*dHeight, paint);
}
//画列
for(int i = 0;i <= col + 1; i++){
canvas.drawLine(i*dWidth, 0, i*dWidth, height, paint);
}
//释放canvas对象
holder.unlockCanvasAndPost(canvas);
}
//笔触事件
@Override
public boolean onTouchEvent(MotionEvent event)
{
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
if(allowIn){
int col = (int)event.getX()/dWidth;
int row = (int)event.getY()/dHeight;
//Log.v("ACTION_DOWN",String.valueOf(row)+"-"+String.valueOf(col));
arry[row][col] = -arry[row][col];
flag = arry[row][col];
drawArry(arry);
}
break;
case MotionEvent.ACTION_MOVE:
//Log.v("ACTION_MOVE",String.valueOf((int)event.getX())+"-"+String.valueOf((int)event.getY()));
//要加入过界处理防止数组过界
if(allowIn){
int c = (int)event.getX()/dWidth;
int r = (int)event.getY()/dHeight;
if(c >= col){ c = col-1; }
if(c <= 0){ c = 0; }
if(r >= row){ r = row-1; }
if(r <= 0){ r = 0; }
arry[r][c] = flag;
drawArry(arry);
}
break;
case MotionEvent.ACTION_UP:
//Log.v("ACTION_UP",String.valueOf((int)event.getX())+"-"+String.valueOf((int)event.getY()));
case MotionEvent.ACTION_POINTER_DOWN:
//Log.v("ACTION_POINTER_DOWN",String.valueOf((int)event.getX())+"-"+String.valueOf((int)event.getY()));
break;
default:
break;
}
return true;
}
@Override
public void run() {
// TODO Auto-generated method stub
}
}