gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 02:40:40 25 4
gpt4 key购买 nike

我目前正在关注这个 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com