Android绘制矩形与所有设备上相同的高度

p8h8hvxi  于 2023-02-14  发布在  Android
关注(0)|答案(1)|浏览(114)

在Android中,我尝试使用Rect()绘制日历

public void init(Context context) {
    bounds = new Rect();
    boundPaint = new Paint();
    boundPaint.setColor(Color.parseColor("#527257"));
    boundPaint.setStyle(Paint.Style.STROKE);

    boundPaint.setAntiAlias(true);
    boundPaint.setStrokeWidth(1);
    boundPaint.setStrokeJoin(Paint.Join.ROUND);
    boundPaint.setStrokeCap(Paint.Cap.ROUND);

    subLinePaint = new Paint(boundPaint);
    subLinePaint.setColor(Color.parseColor("#a2bba5"));

    textPaint = new Paint(boundPaint);
    textPaint.setColor(Color.parseColor("#527257"));
    textPaint.setTextSize(Utils.dpToPx(10f, context));

    barPaint = new Paint();
    barPaint.setAntiAlias(true);
    barPaint.setStyle(Paint.Style.FILL_AND_STROKE);
}

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    if (plant != null) {
        paint(canvas);
    }
}

private void paint(Canvas canvas) {
    getDrawingRect(bounds);

    Utils.reduceRectBy(bounds, MARGIN);
    canvas.drawRect(bounds, boundPaint);

    float partWidth = bounds.width() / 36f;

    // draw vertical lines
    for (int i = 0; i < 36; ++i) {
        if (i % 3 == 0) {
            canvas.drawLine(
                    bounds.left + partWidth * i,
                    bounds.top,
                    bounds.left + partWidth * i,
                    bounds.bottom, boundPaint);

            //Paint month label
            String month = Plant.MONTHS[i / 3];
            canvas.drawText(month, (bounds.left + 12) + partWidth * i, bounds.top - 16, textPaint);

        } else {
            canvas.drawLine(
                    bounds.left + partWidth * i,
                    bounds.top,
                    bounds.left + partWidth * i,
                    bounds.bottom, subLinePaint);
        }
    }   
}

在我的布局中我有

<RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content">

            <TextView
                android:id="@+id/title"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_centerHorizontal="true"
                android:layout_margin="10dp"
                android:textColor="#338032"
                android:textSize="24sp" />

            <darksymphony.osiva.GardenCalendarView
                android:id="@+id/gardenCalendar"
                android:layout_width="match_parent"
                android:layout_height="84dp"
                android:layout_below="@+id/title"
                android:layout_marginStart="5dp"
                android:layout_marginTop="5dp"
                android:layout_marginEnd="5dp"
                android:layout_marginBottom="5dp" />
</RelativeLayout>

在高密度设备上,日历看起来不错,它的高度刚好符合矩形宽度,例如宽度:972,身高:151-打印bounds.width()bounds.height()
但在低密度设备(例如平板电脑)上,设备的全宽较低,矩形的高度非常小(bounds.width():706,bounds.height():第32段)。
因此,在GardenCalendarView的布局中,我将高度增加到android:layout_height="120dp",然后在init(Context context)中,我定义了矩形的参数:

bounds = new Rect(0,0,getWidth(),getHeight());

对于低密度器件,bounds.height() = 80,看起来非常好。然而,对于高密度器件,高度非常大:bounds.height() = 250。
那么我怎样才能画出在所有设备上看起来都一样的矩形呢?我甚至不能设置最大高度,对于平板电脑,我需要不同的高度作为高密度设备

bxgwgixi

bxgwgixi1#

由于我没有找到更简单的解决方案,现在我这样解决这个问题:

RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) gardenCalendar.getLayoutParams();
        params.height = getDensity();
        gardenCalendar.setLayoutParams(params);

然后检查器件密度:

public int getDensity() {

        float density = getResources().getDisplayMetrics().density;

        if (density == 0.75f)
        {   // LDPI
            hh = 140;
        }
        else if (density >= 1.0f && density < 1.5f)
        {
            hh = 160; 
            // MDPI
        }
        else if (density == 1.5f)
        {
            hh = 185;
            // HDPI
        }
        else if (density > 1.5f && density <= 2.0f)
        {
            // XHDPI
            hh = 185; 
        }
        else if (density > 2.0f && density <= 3.0f)
        {
            hh = 235; 
            // XXHDPI
        }
        else
        {
            hh = 250;
            // XXXHDPI
        }

        return hh;
    }

在多个密度不同的设备上测试,现在看起来工作正常。

相关问题