Android:在现有图像上绘制矩形图像

时间:2016-12-12 00:27:36

标签: java android

我正在创建一个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()方法。我究竟做错了什么?如何在网格线顶部的滚动视图中显示这些块并与点击进行交互?如果可能的话,我更愿意使用自定义视图,因为每个块都需要与特定数据相关联。

0 个答案:

没有答案