我有点卡住了。
我尝试创建一个像桌子一样的自定义视图!但是onDraw方法只绘制第一个单元格/矩形。
这是我的观点:
public class CustomView extends View {
private static int ROWS = 8;
private static int COLS = 8;
final Paint p = new Paint();
public CustomView(Context context) {
super(context);
p.setColor(Color.GREEN);
}
@Override
public void onDraw(Canvas canvas) {
canvas.drawColor(Color.RED);
float width = getWidth();
float height = getHeight();
float cellWidth = width/COLS;
float cellHeight = height/ROWS;
for(float row = 0; row<ROWS; row++) {
for(float col = 0; col<COLS; col++) {
RectF cell = new RectF( (cellWidth*col), (cellHeight*row), cellWidth, cellHeight);
canvas.drawRect(cell, p);
}
}
}
}
我的XML:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/mainLayout"
android:orientation="vertical"
android:background="#000000"
tools:context="com.biegertfunk.qlocktwo.Act_Main">
<RelativeLayout
android:id="@+id/centerView"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
我的活动:
public class Act_Main extends AppCompatActivity {
//views
public CustomView mainView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.act_main);
int size = getSize();
RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(size, size);
layoutParams.addRule(RelativeLayout.CENTER_IN_PARENT);
RelativeLayout mainLayout = (RelativeLayout) findViewById(R.id.centerView);
mainView = new CustomView(this);
mainLayout.addView(mainView, layoutParams);
}
private int getSize() {
Display display = getWindowManager().getDefaultDisplay();
Point size = new Point();
display.getSize(size);
int width = size.x;
int height = size.y;
if(width>height) {
return height;
} else {
return width;
}
}
}
但结果只显示了一个矩形:
答案 0 :(得分:1)
您在cell
内计算onDraw()
是错误的。试试这种方式:
RectF cell = new RectF(
(cellWidth*col), (cellHeight*row),
(cellWidth*col)+cellWidth, (cellHeight*row)+cellHeight
);
RectF
的构造函数是
RectF(float left, float top, float right, float bottom)
<强>不强>
RectF(float left, float top, float width, float height) // WRONG
请参阅文档here。
答案 1 :(得分:0)
方法RectF
中传递的参数顺序不正确。正如您在RectF documentation中的此方法文档中所看到的
您将看到参数的顺序分别为left
,top
,right
和bottom
。此外,你的左参数必须小于或等于右参数,这可能不会出现在你的代码中。
答案 2 :(得分:-1)
添加代码
invalidate();
到
for(float row = 0; row<ROWS; row++) {
for(float col = 0; col<COLS; col++) {
RectF cell = new RectF( (cellWidth*col), (cellHeight*row), cellWidth, cellHeight);
canvas.drawRect(cell, p);
invalidate();
}
}