线性布局内的Android自定义视图与其他视图

时间:2015-09-23 11:05:05

标签: android android-layout android-canvas android-custom-view

我有一个自定义视图来显示一个简单的饼图 我的目的是通过布局xml文件获取大小,背景颜色等值 我推导出圆的半径,笔划宽度等作为视图高度的因子(宽度等于父/屏幕的宽度),所有尺寸都基于此半径。

这是片段

的布局xml
<LinearLayout 
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:custom="http://schemas.android.com/apk/res-auto"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/bluegrey200"
tools:context="ash.dbtest.GraphPieChartFragment">

    <ash.dbtest.GraphPieChartView
        android:layout_width="match_parent"
        android:id="@+id/pieChart1"
        custom:backgroundColor="@color/bluegrey800"
        custom:labelColor="@color/white"
        android:layout_height="800px"
        />

现在看起来非常好。

见图片:

黑色矩形是重写的onDraw方法中使用的区域。注意蓝色对角线显示矩形的边界。 我知道高度是以像素为单位提到的,它必须是dp;但这些值现在用于调试目的。

我将布局xml文件更改为以下,以在另一个线性布局中的自定义视图上方添加横幅。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:custom="http://schemas.android.com/apk/res-auto"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/bluegrey200"
tools:context="ash.dbtest.GraphPieChartFragment">
<LinearLayout
    android:layout_width="match_parent"
    android:orientation="horizontal"
    android:layout_height="wrap_content">
    <TextView
        android:layout_width="wrap_content"
        android:text="TestBanner"
        android:textSize="20sp"
        android:layout_height="wrap_content" />
    </LinearLayout>
    <ash.dbtest.GraphPieChartView
        android:layout_width="match_parent"
        android:id="@+id/pieChart1"
        custom:backgroundColor="@color/bluegrey800"
        custom:labelColor="@color/white"
        android:layout_height="800px"
        />

现在看截图,很奇怪。

见图:

现在我的自定义视图移到了底部,但是被截断了。 onDraw方法获得了正确的尺寸,圆圈正在被绘制。但不知何故,View被截断了。在下面的屏幕截图中,请注意黑色矩形不完整蓝色对角线被截断。 可能是什么问题?
我是android的初学者,希望我提供了所有必需的信息。我没有发布代码,因为它只是在画布上绘制。 非常感谢你在这方面的时间。

GraphPieCharView.onDraw上的代码

  @Override
public void onDraw(Canvas canvas) {

    Log.d("onDraw","onDraw");
    Log.d("onDraw1",Float.toString(this.getLeft()));
    Log.d("onDraw2",Float.toString(this.getTop()));
    Log.d("onDraw3",Float.toString(this.getRight()));
    Log.d("onDraw4",Float.toString(this.getBottom()));
    paint.setAntiAlias(true);
    paint.setFilterBitmap(true);
    paint.setStrokeWidth(20);
    paint.setStyle(Paint.Style.STROKE);
    paint.setColor(BACKGROUND_COLOR);
    canvas.drawRect(this.getLeft(),this.getTop(),this.getRight(),this.getBottom(),paint);

3 个答案:

答案 0 :(得分:0)

因为GraphPieChartView位于TextView

之下

答案 1 :(得分:0)

如果你想确保视图适合设备的屏幕,你必须调用&#34; getMeasuredWidth()&#34;和&#34; getMeasuredHeight()&#34;在自定义视图&#34; onDraw()&#34;方法并根据结果缩放视图。

另见the Reference for these methods

除此之外,最好手动设置矩形左上角的坐标 - 你知道你希望它们是(0,0)而不是&#39; getTop()& #39;出于某种原因的方法给了我28.0(状态栏的高度?但为什么在这里?)

首先删除

  

机器人:layout_height =&#34; 800像素&#34;

从布局文件中

然后编写

AssertionError: Calls not found.
  Expected: [call.derived_method_1st(), call.derived_method_2nd(),   call.derived_method_3rd()]
  Actual: [call.run_this()]

沿着View的边缘有一个矩形。请注意,只有一半的绘制边框显示,换句话说,一半的笔触宽度在矩形边界之外,因此不可见。所以也许你必须使用第二个canvas.drawRect(0,0,this.getMeasuredWidth(),getMeasuredHeight(),paint); 作为内线。

答案 2 :(得分:0)

想出来。 我正在使用下面的代码绘制矩形 canvas.drawRect(this.getLeft(),this.getTop(),this.getRight(),this.getBottom(),paint);

让我们说这个页面是1500px高和1000px宽。 这里,当customview是页面上的唯一视图时,下面是getter的结果。 左 - 0 顶部 - 0 对 - 1000 底部 - 800

我在这些边界中绘制了矩形,并根据这些边界进行了所有计算;它工作得很好。

现在,当自定义视图是垂直列出时的第二个视图时,顶部TextView采用50px,

左 - 0 顶部 - 50 对 - 1000 底部 - 850

但这些值是相对于整个屏幕(1000 * 1500)。 但在我的自定义视图中,我的画布是1000 * 800,从0,0开始,对角线以1000,800结束。 但是我在画布上绘画,好像它从0,50开始到1000,850结束。

将onDraw方法中的计算调整为始终从0,0开始,它解决了问题。

感谢所有回复。