我的问题是,如果我将视图的Y轴设置为0以外的任何值,则其绘制的区域将从顶部剪切。使用日志跟踪我发现视图边界(及其可绘制的边界)始终是正确的位置。我尝试过clipChildren = false,但这给了我一个陌生人的行为,其中绘制的区域和视图边界不同步。这是我视图中的所有相关代码
//onMeasure
@Override
public void onMeasure(int w, int h){
int width = MeasureSpec.getSize(w);
//minHeight is 48dp scaled for density
setMeasuredDimension(width, minHeight);
}
//onDraw
//Note that i've ommited the log statements, however they return the correct
//coordinates for the view Rect
@Override
public void onDraw(Canvas c){
c.drawRect(trackRect, tempPaint);
}
//onLayout
@Override
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
trackRect.set(left, top, right, bottom);
mTrack.setBounds(trackRect); //irrelevant atm
}
//XML CODE
//BELOW draws a perfect rectangle with a width of match_parent and a height
//of 48dp
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clipChildren="false" >
<com.bryanstudios.bryan.clock.LocationSwitch
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</RelativeLayout>
//BELOW will cause clipping
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clipChildren="false">
<com.bryanstudios.bryan.clock.LocationSwitch
android:layout_marginTop="10dp"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</RelativeLayout>
//BELOW causes the view to disappear entirely
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clipChildren="false">
<com.bryanstudios.bryan.clock.LocationSwitch
android:align_parent_bottom="true"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</RelativeLayout>
我最好的猜测是我的onMeasure没有正确完成。另请注意,无论我在何处定位视图(通过w / margin或LayoutParam属性),视图的逻辑定位都是准确的,但绘制的区域不是。
答案 0 :(得分:0)
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
trackRect.set(left, top, right, bottom);
...
这里的left / top / etc参数是相对于父级的。如果视图的y位置== 0,则top = = 0.如果更改视图相对于其父级的Y位置,则top设置为相同的值。然后,您将此顶部分配给您绘制的矩形。
public void onDraw(Canvas c){
c.drawRect(trackRect, tempPaint);
...
这将绘制一个矩形,其具有您在onLayout中指定的相同偏移量。这意味着它将从视图顶部开始绘制trackRect.top
。
如果您只想要视图的实际尺寸,可能只需要view.getWidth()
和view.getHeight()
;如果要在知道视图的宽度和高度时初始化某些内容(如路径),请覆盖onSizeChanged()
并在其中而不是onLayout()
中执行此操作。