如果我的自定义视图的位置不是(0,0)

时间:2016-11-22 00:23:04

标签: android view

我的问题是,如果我将视图的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属性),视图的逻辑定位都是准确的,但绘制的区域不是。

1 个答案:

答案 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()中执行此操作。