在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。
那么我怎样才能画出在所有设备上看起来都一样的矩形呢?我甚至不能设置最大高度,对于平板电脑,我需要不同的高度作为高密度设备
1条答案
按热度按时间bxgwgixi1#
由于我没有找到更简单的解决方案,现在我这样解决这个问题:
然后检查器件密度:
在多个密度不同的设备上测试,现在看起来工作正常。