Android PixelGrid OnDraw 检查/跟踪当前位置

标签 android grid android-canvas

我目前正在关注这个 answer .从this answer开始,它表明像素/网格是否已被触摸将被检查。但是,我想检查一个网格作为起点,并在 mainactivity 上有控件/按钮来移动起点。例如,如果用户点击向前移动按钮,起点将向前移动,检查新网格并将前一个点设置为白色。现在我在 moveForward() 方法中的 checkedCell[column][row] 上得到 nullpointerexception

所以,这是我的代码:

public class PixelGridView extends View {
private int numColumns, numRows;
private int cellWidth, cellHeight;
private Paint blackPaint = new Paint();
private boolean[][] cellChecked;

public PixelGridView(Context context)
{
    this(context, null);
}

public PixelGridView(Context context, AttributeSet attrs)
{
    super(context, attrs);
    blackPaint.setStyle(Paint.Style.FILL_AND_STROKE);
}

public void setNumColumns(int numColumns)
{
    this.numColumns = numColumns;
    calculateDimensions();
}

public int getNumColumns()
{
    return numColumns;
}

public void setNumRows(int numRows)
{
    this.numRows = numRows;
    calculateDimensions();
}

public int getNumRows()
{
    return numRows;
}

@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh)
{
    super.onSizeChanged(w, h, oldw, oldh);
    calculateDimensions();
}

private void calculateDimensions()
{
    if (numColumns == 0 || numRows == 0)
        return;

    cellWidth = getWidth() / numColumns;
    cellHeight = getHeight() / numRows;

    cellChecked = new boolean[numColumns][numRows];

    invalidate();
}

@Override
protected void onDraw(Canvas canvas)
{
    super.onDraw(canvas);

    canvas.drawColor(Color.WHITE);

    if (numColumns == 0 || numRows == 0)
        return;

    int width = getWidth();
    int height = getHeight();

    for (int i = 0; i < numColumns; i++)
    {
        for (int j = 0; j < numRows; j++)
        {
            if (cellChecked[i][j])
            {
                canvas.drawRect(i * cellWidth, j * cellHeight, (i + 1) * cellWidth, (j + 1) * cellHeight, blackPaint);
            }
        }
    }       

    for (int i = 1; i < numColumns; i++)
    {
        canvas.drawLine(i * cellWidth, 0, i * cellWidth, height, blackPaint);
    }

    for (int i = 1; i < numRows; i++)
    {
        canvas.drawLine(0, i * cellHeight, width, i * cellHeight, blackPaint);
    }
}

@Override
public boolean onTouchEvent(MotionEvent event)
{
    if (event.getAction() != MotionEvent.ACTION_DOWN)
        return true;

    int column = (int)(event.getX() / cellWidth);
    int row = (int)(event.getY() / cellHeight);

    cellChecked[column][row] = !cellChecked[column][row];
    invalidate();

    return true;
}
public void moveForward() {
//set column and row to be checked at [1][1] upon button click on mainactivity
    int column = 1;
    int row = 1;
    cellChecked[column][row] = !cellChecked[column][row];
    invalidate();
}
}

这是我调用 moveForward() 方法的 Activity

public class MainActivity extends Activity {
PixelGridView pgv;
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);

    pgv = new PixelGridView(this);
    pgv.setNumColumns(20);
    pgv.setNumRows(15);

}

public void onBtnForwardPressed(View view) {
        pgv.moveForward();
    }
}

这是日志:

05-10 00:36:33.388: E/AndroidRuntime(8414): Caused by: java.lang.NullPointerException
05-10 00:36:33.388: E/AndroidRuntime(8414):     at com.test.PixelGridView.moveForward(PixelGridView.java:131)
05-10 00:36:33.388: E/AndroidRuntime(8414):     at com.test.MainActivity.onBtnForwardPressed(MainActivity.java:281)

移动机器人的 moveForward() 方法:

if (currentAngle == 0) {
        for (int i = 0; i < numColumns; i++) {
            for (int j = 0; j < numRows; j++) {
                if (cellChecked[i][j]) {
                    column1 = i;
                    row1 = j;

                }
            }
        } 
        cellChecked[column1][row1] = !cellChecked[column1][row1];           
        cellChecked[column1+1][row1] = !cellChecked[column1+1][row1];
        invalidate();
    }

最佳答案

PixelGridView您正在使用 new 创建的对象不在 Activity 的布局中,因为您尚未添加它。如果您定义了一个 PixelGridViewactivity_main布局,那么你应该把它分配给pgv使用 findViewById()方法。如果你打算以编程方式创建它,那么你应该使用 addContentView() 将它添加到 Activity 的布局中。方法。

关于Android PixelGrid OnDraw 检查/跟踪当前位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25793996/

相关文章:

android - android 中的可绘制文本与左对齐

android - 如何从 Android 中的 Google map 中删除特定标记

grid - 2D 网格水/液体模拟(基于平台游戏)

javascript - 使用自定义 "click"处理程序在网格单元格中呈现链接

asp.net-mvc - MVC3 Bootstrap 带有网格的表格数据

android - 在 Android 的 Canvas 中绘制球体?

android - 您可以使用 Facebook 验证超过 24 小时吗?

java - Android 应用程序按钮不起作用

Android 从 Assets 复制 SQLite 数据库在 KitKat 4.4 上不起作用

android - 在 Android Canvas 上绘画的最佳方式