我正在创建一个Android应用程序并尝试以编程方式在ScrollLayout中包含的两个自定义视图之一上绘制一些带有文本的可单击矩形块。我的ScrollLayout的XML如下所示:
<ScrollView
android:layout_width="match_parent"
android:id="@+id/calendarGridContainerView"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:layout_below="@+id/employeeSpinnerContainer"
android:paddingBottom="72dp"
android:layout_height="match_parent"
android:overScrollMode="never"
android:fillViewport="true"
android:elevation="1dp">
<LinearLayout
android:orientation="horizontal"
android:layout_width="wrap_content"
android:id="@+id/schedule_view_container"
android:layout_height="wrap_content">
<FrameLayout
android:layout_height="wrap_content"
android:id="@+id/schedule_time_frame"
android:layout_width="100dp"
android:layout_alignParentTop="false"
android:layout_weight="0.5">
<include
layout="@layout/schedule_time_view"
android:layout_height="wrap_content"
android:layout_width="100dp" />
</FrameLayout>
<FrameLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/schedule_grid_frame"
android:minHeight="179dp"
android:layout_toRightOf="@+id/schedule_time_frame"
android:layout_centerHorizontal="false"
android:layout_weight="8">
<include
layout="@layout/schedule_grid_layout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
</FrameLayout>
</LinearLayout>
</ScrollView>
请注意,名为scheduleGridLayout
的布局是我尝试绘制这些矩形的位置。它具有以下XML:
<?xml version="1.0" encoding="utf-8"?>
<(package).ScheduleGridLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:scheduleGridLayout="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
</(package).ScheduleGridLayout>
(复制上面的代码时,我删除了包名。)
在ScheduleGridLayout.java
的构造函数中,我调用this.setWillNotDraw(false);
。在绘制矩形之前,我通过覆盖的onDraw()
方法在ScheduleGridLayout上绘制一些水平网格线:
paint.setStyle(Paint.Style.STROKE);
paint.setColor(Color.LTGRAY);
final int width = getWidth();
final int rowHeight = ScheduleTimeLayout.SCHEDULE_VIEW_ROW_HEIGHT + ScheduleTimeLayout.TIME_LABEL_HEIGHT;
for(int i = 0; i < ScheduleTimeLayout.TIME_SEGMENT_COUNT + 1; i++){
if ((i % (int)(1.0/ScheduleTimeLayout.SEGMENT_SIZE)) == 0){
paint.setColor(Color.GRAY);
paint.setStrokeWidth((float)4.0);
}
else{
paint.setColor(Color.LTGRAY);
paint.setStrokeWidth((float)2.0);
}
int y = 178 + (int)(i*(rowHeight + 1) - rowHeight/2.0);
canvas.drawLine(0, y, width, y, paint);
}
由于我希望矩形可以点击,我必须将它们添加为某种视图,而不是简单地将它们的图像绘制到画布上。我尝试了几种不同的方法来绘制矩形 - 目前我尝试在onFinishInflate()
ScheduleGridLayout.java
中进行绘制,如下所示:
Bitmap bmp = Bitmap.createBitmap(60,200,Bitmap.Config.RGB_565);
Bitmap tempBitmap = Bitmap.createBitmap(bmp.getWidth(), bmp.getHeight(), Bitmap.Config.RGB_565);
Canvas tempCanvas = new Canvas(tempBitmap);
paint = new Paint();
paint.setColor(Color.RED);
tempCanvas.drawBitmap(bmp, 0, 0, null);
tempCanvas.drawRoundRect(new RectF(0,0,600,600), 2, 2, paint);
ImageView testBlock = new ImageView(getContext());
testBlock.setImageDrawable(new BitmapDrawable(getResources(), tempBitmap));
addView(testBlock);
但是,当我这样做时,不会出现阻止。
在另一次尝试中,我尝试为计划块创建XML布局文件:
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_height="wrap_content"
android:layout_width="wrap_content">
<com.dalc.dalccalendar.ScheduleBlock
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:scheduleGridLayout="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/schedule_block">
</com.dalc.dalccalendar.ScheduleBlock>
在ScheduleBlock.java
中,我使用onMeasure()
覆盖setMeasuredDimension
来设置块的大小,并使用以下代码覆盖onDraw()
:
super.onDraw(canvas);
paint = new Paint();
paint.setStyle(Paint.Style.FILL);
paint.setColor(Color.RED);
canvas.drawPaint(paint);
String bgColor = "#FF0000";
setBackgroundColor(Color.parseColor(bgColor));
我注意到红色矩形确实出现在XML文件的预览中,但是当我尝试在ScheduleGridLayout
中添加块时却没有:
FrameLayout blockFrame = (FrameLayout)LayoutInflater.from(getContext()).inflate(R.layout.schedule_block_container, this, false);
testBlock.setElevation(4);
addView(blockFrame);
当我运行应用程序时,不仅不显示矩形,而且我发现没有调用ScheduleBlock的onDraw()
方法。我究竟做错了什么?如何在网格线顶部的滚动视图中显示这些块并与点击进行交互?如果可能的话,我更愿意使用自定义视图,因为每个块都需要与特定数据相关联。