- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我目前正在关注这个 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 的布局中,因为您尚未添加它。如果您定义了一个 PixelGridView
在activity_main
布局,那么你应该把它分配给pgv
使用 findViewById()
方法。如果你打算以编程方式创建它,那么你应该使用 addContentView()
将它添加到 Activity 的布局中。方法。
关于Android PixelGrid OnDraw 检查/跟踪当前位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25793996/
我正在寻找一种用Java制作一个简单的网格的方法,如果你拖动鼠标,它就会填充像素。所以只是一个简单的绘图表面... 现在重要的是我可以选择分辨率,或者换句话说,选择像素大小...... 我需要在网格中
我目前正在关注这个 answer .从this answer开始,它表明像素/网格是否已被触摸将被检查。但是,我想检查一个网格作为起点,并在 mainactivity 上有控件/按钮来移动起点。例如,
我是一名优秀的程序员,十分优秀!